1.要分别找两个端点,即两个边界,进行两次二分
2.注意两次二分的边界,以及中点计算
口诀:左加1右不加1(L = M ; R = M)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d ", &q[i]);
for (int i = 0; i < m; i++) {
int x;
scanf("%d ", &x);
//找二分x的左端点
int l = 0, r = n - 1;
while(l < r) {
int mid = l + r >> 1;
if (q[mid] >= x) r = mid;
else l = mid + 1;
}
if (q[r] == x) {
cout << r << ' ';
r = n - 1;
//找二分x的右端点
while(l < r) {
int mid = l + r + 1 >> 1;
if (q[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
else cout << "-1 -1" << endl;
}
return 0;
}