#include <iostream>
#include <vector>
#include <algorithm>
namespace std {
template < class RandomIt, class T>
RandomIt binary_locate( RandomIt begin, RandomIt end, const T& val) {
if ( val == * end) return begin;
auto d = std:: distance ( begin, end) ;
if ( d== 1 ) return begin;
auto center = ( begin + ( d/ 2 ) ) ;
if ( val < * center) return binary_locate( begin, center, val) ;
return binary_locate( center, end, val) ;
}
}
int main( ) {
std:: vector < double > values = { 0 , 0.5 , 1 , 5 , 7.5 , 10 , 12.5 } ;
std:: vector < double > tests = { 0 , 0.4 , 0.5 , 3 , 7.5 , 11.5 , 12.5 , 13 } ;
for ( double d : tests) {
auto it = std:: binary_locate ( values.begin ( ) , values.end ( ) , d) ;
std:: cout << "found " << d << " right after index " << std:: distance ( values.begin ( ) , it) << " which has value " << * it << std:: endl ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKbmFtZXNwYWNlIHN0ZCB7Cgp0ZW1wbGF0ZTxjbGFzcyBSYW5kb21JdCwgY2xhc3MgVD4KUmFuZG9tSXQgYmluYXJ5X2xvY2F0ZShSYW5kb21JdCBiZWdpbiwgUmFuZG9tSXQgZW5kLCBjb25zdCBUJiB2YWwpIHsKICBpZih2YWwgPT0gKmVuZCkgcmV0dXJuIGJlZ2luOwogIGF1dG8gZCA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCk7ICAKICBpZihkPT0xKSByZXR1cm4gYmVnaW47CiAgYXV0byBjZW50ZXIgPSAoYmVnaW4gKyAoZC8yKSk7CiAgaWYodmFsIDwgKmNlbnRlcikgcmV0dXJuIGJpbmFyeV9sb2NhdGUoYmVnaW4sIGNlbnRlciwgdmFsKTsKICByZXR1cm4gYmluYXJ5X2xvY2F0ZShjZW50ZXIsIGVuZCwgdmFsKTsKfQoKfQoKaW50IG1haW4oKSB7CglzdGQ6OnZlY3Rvcjxkb3VibGU+IHZhbHVlcyA9IHswLCAwLjUsIDEsIDUsIDcuNSwgMTAsIDEyLjV9OwoJc3RkOjp2ZWN0b3I8ZG91YmxlPiB0ZXN0cyA9IHswLCAwLjQsIDAuNSwgMywgNy41LCAxMS41LCAxMi41LCAxM307Cglmb3IoZG91YmxlIGQgOiB0ZXN0cykgewoJCWF1dG8gaXQgPSBzdGQ6OmJpbmFyeV9sb2NhdGUodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgZCk7CgkJc3RkOjpjb3V0IDw8ICJmb3VuZCAiIDw8IGQgPDwgIiByaWdodCBhZnRlciBpbmRleCAiIDw8IHN0ZDo6ZGlzdGFuY2UodmFsdWVzLmJlZ2luKCksIGl0KSA8PCAiIHdoaWNoIGhhcyB2YWx1ZSAiIDw8ICppdCA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==