class Main {
// Method to find the first occurrence of 'value' in array 'b'
public static int firstOccurrence(int value, int[] b, int n) {
int start = 0, end = n - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (b[mid] == value) {
if (mid == 0 || b[mid - 1] != value) {
return mid; // Found the first occurrence
} else {
end = mid - 1; // Search in the left half
}
} else if (b[mid] < value) {
start = mid + 1; // Search in the right half
} else {
end = mid - 1; // Search in the left half
}
}
return -1; // Not found
}
// Method to find the last occurrence of 'value' in array 'b'
public static int lastOccurrence(int value, int[] b, int n) {
int start = 0, end = n - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (b[mid] == value) {
if (mid == n - 1 || b[mid + 1] != value) {
return mid; // Found the last occurrence
} else {
start = mid + 1; // Search in the right half
}
} else if (b[mid] < value) {
start = mid + 1; // Search in the right half
} else {
end = mid - 1; // Search in the left half
}
}
return -1; // Not found
}
// Method to find an element that does not occur exactly k times
public static int findElement(int[] b, int n, int k) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
int l1 = firstOccurrence(b[mid], b, n);
int h1 = lastOccurrence(b[mid], b, n);
int d = (l1 != -1 && h1 != -1) ? (h1 - l1 + 1) : 0; // Check for valid indices
if (d < k) { // If occurrences are less than k
return b[mid];
}
if ((h1 - low + 1) % k == 0) { // Check if the range is valid
low = h1 + 1; // Move to the right
} else {
high = l1 - 1; // Move to the left
}
}
return -1; // Return -1 if no valid element is found
}
public static void main
(String[] args
) { int[] b = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; // Example array
int n = b.length;
int k = 3; // Example k value
int result = findElement(b, n, k);
if (result != -1) {
System.
out.
println("Element that does not occur " + k
+ " times: " + result
); } else {
System.
out.
println("All elements occur " + k
+ " times or more."); }
}
}
Y2xhc3MgTWFpbiB7CgogICAgLy8gTWV0aG9kIHRvIGZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgJ3ZhbHVlJyBpbiBhcnJheSAnYicKICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpcnN0T2NjdXJyZW5jZShpbnQgdmFsdWUsIGludFtdIGIsIGludCBuKSB7CiAgICAgICAgaW50IHN0YXJ0ID0gMCwgZW5kID0gbiAtIDE7CiAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkgewogICAgICAgICAgICBpbnQgbWlkID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpIC8gMjsKICAgICAgICAgICAgaWYgKGJbbWlkXSA9PSB2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKG1pZCA9PSAwIHx8IGJbbWlkIC0gMV0gIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlkOyAvLyBGb3VuZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxOyAvLyBTZWFyY2ggaW4gdGhlIGxlZnQgaGFsZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGJbbWlkXSA8IHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7IC8vIFNlYXJjaCBpbiB0aGUgcmlnaHQgaGFsZgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZW5kID0gbWlkIC0gMTsgLy8gU2VhcmNoIGluIHRoZSBsZWZ0IGhhbGYKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7IC8vIE5vdCBmb3VuZAogICAgfQoKICAgIC8vIE1ldGhvZCB0byBmaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgJ3ZhbHVlJyBpbiBhcnJheSAnYicKICAgIHB1YmxpYyBzdGF0aWMgaW50IGxhc3RPY2N1cnJlbmNlKGludCB2YWx1ZSwgaW50W10gYiwgaW50IG4pIHsKICAgICAgICBpbnQgc3RhcnQgPSAwLCBlbmQgPSBuIC0gMTsKICAgICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CiAgICAgICAgICAgIGludCBtaWQgPSBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyOwogICAgICAgICAgICBpZiAoYlttaWRdID09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAobWlkID09IG4gLSAxIHx8IGJbbWlkICsgMV0gIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlkOyAvLyBGb3VuZCB0aGUgbGFzdCBvY2N1cnJlbmNlCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTsgLy8gU2VhcmNoIGluIHRoZSByaWdodCBoYWxmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYlttaWRdIDwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTsgLy8gU2VhcmNoIGluIHRoZSByaWdodCBoYWxmCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxOyAvLyBTZWFyY2ggaW4gdGhlIGxlZnQgaGFsZgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsgLy8gTm90IGZvdW5kCiAgICB9CgogICAgLy8gTWV0aG9kIHRvIGZpbmQgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IG9jY3VyIGV4YWN0bHkgayB0aW1lcwogICAgcHVibGljIHN0YXRpYyBpbnQgZmluZEVsZW1lbnQoaW50W10gYiwgaW50IG4sIGludCBrKSB7CiAgICAgICAgaW50IGxvdyA9IDA7CiAgICAgICAgaW50IGhpZ2ggPSBuIC0gMTsKCiAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwoKICAgICAgICAgICAgaW50IGwxID0gZmlyc3RPY2N1cnJlbmNlKGJbbWlkXSwgYiwgbik7CiAgICAgICAgICAgIGludCBoMSA9IGxhc3RPY2N1cnJlbmNlKGJbbWlkXSwgYiwgbik7CgogICAgICAgICAgICBpbnQgZCA9IChsMSAhPSAtMSAmJiBoMSAhPSAtMSkgPyAoaDEgLSBsMSArIDEpIDogMDsgLy8gQ2hlY2sgZm9yIHZhbGlkIGluZGljZXMKCiAgICAgICAgICAgIGlmIChkIDwgaykgeyAvLyBJZiBvY2N1cnJlbmNlcyBhcmUgbGVzcyB0aGFuIGsKICAgICAgICAgICAgICAgIHJldHVybiBiW21pZF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoaDEgLSBsb3cgKyAxKSAlIGsgPT0gMCkgeyAvLyBDaGVjayBpZiB0aGUgcmFuZ2UgaXMgdmFsaWQKICAgICAgICAgICAgICAgIGxvdyA9IGgxICsgMTsgLy8gTW92ZSB0byB0aGUgcmlnaHQKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpZ2ggPSBsMSAtIDE7IC8vIE1vdmUgdG8gdGhlIGxlZnQKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgbm8gdmFsaWQgZWxlbWVudCBpcyBmb3VuZAogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBpbnRbXSBiID0gezEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDR9OyAvLyBFeGFtcGxlIGFycmF5CiAgICAgICAgaW50IG4gPSBiLmxlbmd0aDsKICAgICAgICBpbnQgayA9IDM7IC8vIEV4YW1wbGUgayB2YWx1ZQogICAgICAgIGludCByZXN1bHQgPSBmaW5kRWxlbWVudChiLCBuLCBrKTsKICAgICAgICAKICAgICAgICBpZiAocmVzdWx0ICE9IC0xKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCB0aGF0IGRvZXMgbm90IG9jY3VyICIgKyBrICsgIiB0aW1lczogIiArIHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGwgZWxlbWVudHMgb2NjdXIgIiArIGsgKyAiIHRpbWVzIG9yIG1vcmUuIik7CiAgICAgICAgfQogICAgfQp9Cg==