// 经典二分 在[begin,end)之间查找val,返回val下标int*binary_search(int* begin,int* end,int val){int n = end - begin;int l = begin - begin, r = end - begin -1;while(l <= r){int mid = l +(r - l)/2;if(*(begin + mid)== val){return begin+mid;}elseif(*(begin + mid)< val){
l = mid +1;}else{
r = mid -1;}}return end;}
二分变种:upper_bound 在[begin,end)之间查找第一个大于val,返回val下标
// upper_bound 在[begin,end)之间查找第一个大于val,返回val下标int*binary_search2(int* begin,int* end,int val){int n = end - begin;int l = begin - begin, r = end - begin -1;while(l <= r){int mid = l +(r - l)/2;if(*(begin + mid)<= val){
l = mid +1;}else{
r = mid -1;}}return begin+l;}
// lower_bound 在[begin,end)之间查找第一个大于等于val的元素,返回val下标int*binary_search3(int* begin,int* end,int val){int n = end - begin;int l = begin - begin, r = end - begin -1;while(l <= r){int mid = l +(r - l)/2;if(*(begin + mid)< val){
l = mid +1;}else{
r = mid -1;}}return begin + l;}