int lowerbound(int l,int r,int target){
while(l<=r){
int mid=(l+r)>>1;
if(val[mid]>=target)r=mid-1;
else l=mid+1; }
return l;
}
int upperbound(int l,int r,int target){
while(l<=r){
int mid=(l+r)>>1;
if(val[mid]>target)r=mid-1;
else l=mid+1; }
return l;
}
保持目标元素在当前区间[l,r]或超尾处,这种写法关注mid位为超尾结束,所以找大于等于target的第一个元素时期望
val[mid]>=target
找大于target的第一个元素是期望
val[mid]>target
这样mid位为正确位置时必定是作为超尾被找到的。
最后只剩一个元素时,必定以l指向正确位置,r指向不正确位置结束,所以返回l