AcWing
789. 数的范围
两个二分函数:
ll(int k)
:寻找不严格单调递增数组中,值为k
的最左边的位置;
rr(int k)
:寻找不严格单调递增数组中,值为k
的最右边的位置。
#include <bits/stdc++.h>
using namespace std;
int n, q;
const int N = 100010;
int a[N];
int ll(int k){
int l = 0, r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(a[mid] >= k) r = mid;
else l = mid + 1;
}
if(a[r] != k) r = -1;
return r;
}
int rr(int k){
int l = 0, r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] <= k) l = mid;
else r = mid - 1;
}
if(a[r] != k) r = -1;
return r;
}
int main(){
cin >> n >> q;
for(int i = 0; i <= n - 1; i++) cin >> a[i];
while(q--){
int k;
cin >> k;
cout << ll(k) << ' ' << rr(k) << endl;
}
return 0;
}