int main()
{
scanf(“%d%d”,&n,&m);
for(int i = 0;i < n;i++)
{
scanf(“%d”,&q[i]);
}
while(m - -)//每个数都要经过下面的操作,并且有m个数
{
int x;
int l=0;
int r=n-1;
scanf(“%d”,&x);//输入要进行操作的数
while(l < r)//假设要求x的范围,我现在求x第一次出现的位置,以k为分界点把数组分为右边大于等于x和左边小于x。
{
int mid=(l+r)/2;
if(q[mid]>=x) r=mid;//求左边界点,即x第一次出现的地方。如果q[mid]大于x,则q[mid]在右边区间内,而要求的x第一次出现的地方在(mid,r)//如果我们取”if(q[mid]>x) r=mid-1”,r可能会一直r=r,进入死循环。可以自己简单举例试一下。
else l=mid+1;
}
if(q[l] !=x)
cout<<-1<<” “<<-1<<endl;
else{
cout<<l<<” “;
int l=0; //
int r=n-1; //全局变量l和r经过之前的操作,值已经被改变,所以要重新创建局部变量l和r
while(l<r)
{
int mid=(l+r+1)/2;
if(q[mid]>x) r=mid-1;//求右边界,即x最后一次出现的地方
else l=mid; //当r与l只相差l的时候,如果mid=(r+l)/2就会向下取整到l,此时l=l,就会死循环
}
cout<<r<<" "<<endl;
}
}
return 0;
}