
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e5+9;
int a[N],n,q;
int main()
{
cin>>n>>q;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<q;i++)
{
int x;cin>>x;
int l=0,r=n-1;
//二分左端点
while(l<r)
{
int mid=l + r >>1;
if(a[mid]>=x) r=mid;
else l=mid+1;//不会取等号
}
//循环退出之后l==r,该位置表示第一个大于x的位置
if(a[l]==x)//如果该位置对应的值为x,则找到了,反之没有找到
{
cout<<l<<' ';
//二分右端点
r=n-1;
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]<=x)l=mid;
else r=mid-1;
}
cout<<r<<endl;
}
else cout<<"-1 -1"<<endl;
}
return 0;
}
如果在查找右端点时也使用 mid = l + r >> 1,
可能会导致死循环或无法正确收敛到右端点。
因为在这种情况下,mid 的计算可能会偏向左边,导致右端点的搜索范围无法正确缩小。