import java.util.*;
class LogNSearch {
public static void main
(String[] args
) { int[] arr = {1, 2, 2, 2, 2, 3, 4, 5, 6, 7}; // Sorted array
int target = 2; // Element to find
int index = findMiddleOccurrence(arr, target);
System.
out.
println("Output: " + index
); }
public static int findMiddleOccurrence(int[] arr, int target) {
int first = findFirstOccurrence(arr, target);
if (first == -1) {
return -1; // Target not found
}
int last = findLastOccurrence(arr, target);
// Calculate middle occurrence
return (first + last) / 2;
}
private static int findFirstOccurrence(int[] arr, int target) {
int l = 0, r = arr.length - 1;
int first = -1;
while (l <= r) {
int m = l + (r - l) / 2; // Avoid overflow
if (arr[m] >= target) {
if (arr[m] == target) {
first = m; // Update first occurrence
}
r = m - 1; // Search left
} else {
l = m + 1; // Search right
}
}
return first;
}
private static int findLastOccurrence(int[] arr, int target) {
int l = 0, r = arr.length - 1;
int last = -1;
while (l <= r) {
int m = l + (r - l) / 2; // Avoid overflow
if (arr[m] <= target) {
if (arr[m] == target) {
last = m; // Update last occurrence
}
l = m + 1; // Search right
} else {
r = m - 1; // Search left
}
}
return last;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgTG9nTlNlYXJjaCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50W10gYXJyID0gezEsIDIsIDIsIDIsIDIsIDMsIDQsIDUsIDYsIDd9OyAvLyBTb3J0ZWQgYXJyYXkKICAgICAgICBpbnQgdGFyZ2V0ID0gMjsgLy8gRWxlbWVudCB0byBmaW5kCiAgICAgICAgaW50IGluZGV4ID0gZmluZE1pZGRsZU9jY3VycmVuY2UoYXJyLCB0YXJnZXQpOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0OiAiICsgaW5kZXgpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpbmRNaWRkbGVPY2N1cnJlbmNlKGludFtdIGFyciwgaW50IHRhcmdldCkgewogICAgICAgIGludCBmaXJzdCA9IGZpbmRGaXJzdE9jY3VycmVuY2UoYXJyLCB0YXJnZXQpOwogICAgICAgIGlmIChmaXJzdCA9PSAtMSkgewogICAgICAgICAgICByZXR1cm4gLTE7IC8vIFRhcmdldCBub3QgZm91bmQKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW50IGxhc3QgPSBmaW5kTGFzdE9jY3VycmVuY2UoYXJyLCB0YXJnZXQpOwogICAgICAgIAogICAgICAgIC8vIENhbGN1bGF0ZSBtaWRkbGUgb2NjdXJyZW5jZQogICAgICAgIHJldHVybiAoZmlyc3QgKyBsYXN0KSAvIDI7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRGaXJzdE9jY3VycmVuY2UoaW50W10gYXJyLCBpbnQgdGFyZ2V0KSB7CiAgICAgICAgaW50IGwgPSAwLCByID0gYXJyLmxlbmd0aCAtIDE7CiAgICAgICAgaW50IGZpcnN0ID0gLTE7CgogICAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICAgICAgaW50IG0gPSBsICsgKHIgLSBsKSAvIDI7IC8vIEF2b2lkIG92ZXJmbG93CiAgICAgICAgICAgIGlmIChhcnJbbV0gPj0gdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyW21dID09IHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gbTsgLy8gVXBkYXRlIGZpcnN0IG9jY3VycmVuY2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIgPSBtIC0gMTsgLy8gU2VhcmNoIGxlZnQKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGwgPSBtICsgMTsgLy8gU2VhcmNoIHJpZ2h0CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpcnN0OwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kTGFzdE9jY3VycmVuY2UoaW50W10gYXJyLCBpbnQgdGFyZ2V0KSB7CiAgICAgICAgaW50IGwgPSAwLCByID0gYXJyLmxlbmd0aCAtIDE7CiAgICAgICAgaW50IGxhc3QgPSAtMTsKCiAgICAgICAgd2hpbGUgKGwgPD0gcikgewogICAgICAgICAgICBpbnQgbSA9IGwgKyAociAtIGwpIC8gMjsgLy8gQXZvaWQgb3ZlcmZsb3cKICAgICAgICAgICAgaWYgKGFyclttXSA8PSB0YXJnZXQpIHsKICAgICAgICAgICAgICAgIGlmIChhcnJbbV0gPT0gdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG07IC8vIFVwZGF0ZSBsYXN0IG9jY3VycmVuY2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGwgPSBtICsgMTsgLy8gU2VhcmNoIHJpZ2h0CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByID0gbSAtIDE7IC8vIFNlYXJjaCBsZWZ0CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxhc3Q7CiAgICB9Cn0K