#include <iostream>
int upperBound(int* array, int lo, int hi, int key) {
int low = lo-1, high = hi;
while (low+1 != high)
{
int mid = (low+high) >> 1;
if (array[mid]> key) high=mid;
else low=mid;
}
int p = low;
if ( p >= hi || array[p] != key )
p=-1;//no key found
return p;
}
int main() {
int arr[2] = {2, 3};
int lo = 1;
int hi = (sizeof arr / sizeof *arr);
int key = 3;
std::cout << upperBound(arr, lo, hi, key) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IHVwcGVyQm91bmQoaW50KiBhcnJheSwgaW50IGxvLCBpbnQgaGksIGludCBrZXkpIHsKICAgIGludCBsb3cgPSBsby0xLCBoaWdoID0gaGk7CiAgICB3aGlsZSAobG93KzEgIT0gaGlnaCkKICAgIHsKICAgICAgICBpbnQgbWlkID0gKGxvdytoaWdoKSA+PiAxOwogICAgICAgIGlmIChhcnJheVttaWRdPiBrZXkpIGhpZ2g9bWlkOwogICAgICAgIGVsc2UgbG93PW1pZDsKICAgIH0KICAgIGludCBwID0gbG93OwogICAgaWYgKCBwID49IGhpIHx8IGFycmF5W3BdICE9IGtleSApCiAgICAgICAgcD0tMTsvL25vIGtleSBmb3VuZAogICAgcmV0dXJuIHA7Cn0KCmludCBtYWluKCkgewogICAgaW50IGFyclsyXSA9IHsyLCAzfTsKICAgIGludCBsbyA9IDE7CiAgICBpbnQgaGkgPSAoc2l6ZW9mIGFyciAvIHNpemVvZiAqYXJyKTsKICAgIGludCBrZXkgPSAzOwogICAgc3RkOjpjb3V0IDw8IHVwcGVyQm91bmQoYXJyLCBsbywgaGksIGtleSkgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0=