int floor(int arr[], int n, int val) // [l, r]中查找
{
int l = 0;
int r = n - 1;
int mid = l + (r - l) / 2;
while (l < r) {
if (arr[mid] > val)
r = mid - 1;
if (arr[mid] < val)
l = mid + 1;
if (arr[mid] == val && arr[mid] != arr[mid - 1])
return mid;
else if(arr[mid] == val && arr[mid] == arr[mid - 1])
r = mid - 1;
if (r == l + 1)
break;
mid = l + (r - l) / 2;
}
if (val >= arr[l] && val <= arr[r])
return l;
else if (val > arr[r])
return r;
else
return -1;
}
int ceil(int arr[], int n, int val)
{
int l = 0;
int r = n - 1;
int mid = l + (r - l) / 2;
while (l < r) {
if (arr[mid] > val)
r = mid - 1;
if (arr[mid] < val)
l = mid + 1;
if (arr[mid] == val && arr[mid] != arr[mid + 1])
return mid;
else if (arr[mid] == val && arr[mid] == arr[mid + 1])
l = mid + 1;
if (r == l + 1)
break;
mid = l + (r - l) / 2;
}
if (val > arr[l] && val <= arr[r])
return r;
else if (val <= arr[l])
return l;
else
return -1;
}