int upper_bound(vector<int>& nums, int target){
if (nums.empty()) return -1;
int l = 0, r = nums.size()-1;
while (l <= r){
int mid = l + (r - l) / 2;
if (nums[mid] == target){
l = mid + 1;
}else if (nums[mid] > target){
r = mid - 1;
}else{
l = mid + 1;
}
}
if (r < 0 || nums[r] != target) return -1;
return r;
}