public class Main {
public static int ub(int[] a, int x) {
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (a[mid] <= x) {
lo = mid + 1;
} else {
if (mid == 0) return 0;
if (a[mid - 1] <= x) return mid;
hi = mid - 1;
}
}
return lo;
}
public static void main
(String[] args
) { int[] data = {2, 4, 4, 4, 8, 12, 12, 15};
int find = 4;
int pos = ub(data, find);
if (pos < data.length) {
System.
out.
println("Upper bound position: " + pos
); } else {
System.
out.
println("Upper bound position: " + data.
length); }
}
}
cHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgaW50IHViKGludFtdIGEsIGludCB4KSB7CiAgICAgICAgaW50IGxvID0gMDsKICAgICAgICBpbnQgaGkgPSBhLmxlbmd0aCAtIDE7CgogICAgICAgIHdoaWxlIChsbyA8PSBoaSkgewogICAgICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpIC8gMjsKICAgICAgICAgICAgaWYgKGFbbWlkXSA8PSB4KSB7CiAgICAgICAgICAgICAgICBsbyA9IG1pZCArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobWlkID09IDApIHJldHVybiAwOwogICAgICAgICAgICAgICAgaWYgKGFbbWlkIC0gMV0gPD0geCkgcmV0dXJuIG1pZDsKICAgICAgICAgICAgICAgIGhpID0gbWlkIC0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbG87CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludFtdIGRhdGEgPSB7MiwgNCwgNCwgNCwgOCwgMTIsIDEyLCAxNX07CiAgICAgICAgaW50IGZpbmQgPSA0OwogICAgICAgIGludCBwb3MgPSB1YihkYXRhLCBmaW5kKTsKCiAgICAgICAgaWYgKHBvcyA8IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXBwZXIgYm91bmQgcG9zaXRpb246ICIgKyBwb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXBwZXIgYm91bmQgcG9zaXRpb246ICIgKyBkYXRhLmxlbmd0aCk7CiAgICAgICAgfQogICAgfQp9Cg==