#include <bits/stdc++.h>
using namespace std;
// Class to compute upper bound
class UpperBoundFinder {
public:
// Function to find the upper bound using binary search
int upperBound(vector<int> &arr, int x, int n) {
int low = 0, high = n - 1;
int ans = n; // Default answer if x is >= all elements
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] > x) {
ans = mid; // Potential answer found
high = mid - 1; // Try to find smaller valid index on the left
} else {
low = mid + 1; // Move right if mid is <= x
}
}
return ans; // Index of the first element > x
}
};
int main() {
vector<int> arr = {3, 5, 8, 9, 15, 19}; // Sorted input array
int n = arr.size(); // Size of the array
int x = 18; // Target value
UpperBoundFinder finder; // Create object
int ind = finder.upperBound(arr, x, n); // Call method
cout << "The upper bound is the index: " << ind << "\n"; // Output result
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBDbGFzcyB0byBjb21wdXRlIHVwcGVyIGJvdW5kCmNsYXNzIFVwcGVyQm91bmRGaW5kZXIgewpwdWJsaWM6CiAgICAvLyBGdW5jdGlvbiB0byBmaW5kIHRoZSB1cHBlciBib3VuZCB1c2luZyBiaW5hcnkgc2VhcmNoCiAgICBpbnQgdXBwZXJCb3VuZCh2ZWN0b3I8aW50PiAmYXJyLCBpbnQgeCwgaW50IG4pIHsKICAgICAgICBpbnQgbG93ID0gMCwgaGlnaCA9IG4gLSAxOwogICAgICAgIGludCBhbnMgPSBuOyAgLy8gRGVmYXVsdCBhbnN3ZXIgaWYgeCBpcyA+PSBhbGwgZWxlbWVudHMKCiAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwoKICAgICAgICAgICAgaWYgKGFyclttaWRdID4geCkgewogICAgICAgICAgICAgICAgYW5zID0gbWlkOyAgICAgICAgLy8gUG90ZW50aWFsIGFuc3dlciBmb3VuZAogICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7ICAgLy8gVHJ5IHRvIGZpbmQgc21hbGxlciB2YWxpZCBpbmRleCBvbiB0aGUgbGVmdAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsgICAgLy8gTW92ZSByaWdodCBpZiBtaWQgaXMgPD0geAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnM7ICAvLyBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCA+IHgKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYXJyID0gezMsIDUsIDgsIDksIDE1LCAxOX07ICAvLyBTb3J0ZWQgaW5wdXQgYXJyYXkKICAgIGludCBuID0gYXJyLnNpemUoKTsgICAgICAgICAgICAgICAgICAgICAvLyBTaXplIG9mIHRoZSBhcnJheQogICAgaW50IHggPSAxODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgdmFsdWUKCiAgICBVcHBlckJvdW5kRmluZGVyIGZpbmRlcjsgICAgICAgICAgICAgICAvLyBDcmVhdGUgb2JqZWN0CiAgICBpbnQgaW5kID0gZmluZGVyLnVwcGVyQm91bmQoYXJyLCB4LCBuKTsgIC8vIENhbGwgbWV0aG9kCgogICAgY291dCA8PCAiVGhlIHVwcGVyIGJvdW5kIGlzIHRoZSBpbmRleDogIiA8PCBpbmQgPDwgIlxuIjsgIC8vIE91dHB1dCByZXN1bHQKICAgIHJldHVybiAwOwp9Cg==