package main
/*
在从小到大的排序数组中,
lower_bound( begin,end,num, flag=true):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的index,不存在则返回end
upper_bound( begin,end,num, flag=true):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的index,不存在则返回end
在从大到小的排序数组中,重载lower_bound()和upper_bound()
lower_bound( begin,end,num, flag=false):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的index,不存在则返回end。
upper_bound( begin,end,num, flag=false):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的index,不存在则返回end
*/
func lower_bound(st int , ed int , key int,num []int , flag bool)int{
left,right := 0,ed-1
if flag == true{
for ;left < right;{
mid := (right + left ) /2
if num[mid] >= key{
right = mid
}else{
left = mid + 1
}
}
}else{
for ;left < right;{
mid := (right + left ) /2
if num[mid] <= key{
right = mid
}else{
left = mid + 1
}
}
}
if right == ed{
return ed
}else{
return right
}
}
func upper_bound(st int , ed int , key int,num []int , flag bool)int{
left,right := 0,ed-1
if flag == true{
for ;left < right;{
mid := (right + left ) /2
if num[mid] > key{
right = mid
}else{
left = mid + 1
}
}
}else{
for ;left < right;{
mid := (right + left ) /2
if num[mid] < key{
right = mid
}else{
left = mid + 1
}
}
}
if right == ed{
return ed
}else{
return right
}
}