include[HTML_REMOVED]
using namespace std;
const int N = 100010;
int n,m;
int q[N];
//二分模版一
int main ()
{
scanf(“%d %d”,&n,&m);
//n表示输入数字的个数,m表示的是需要找的数 的位置
for(int i=0;i<n;i++) scanf(“%d”,&q[i]);
//输入已经排好序的一串数字
//每次循环时找那个数的位置,要进行m次,因为m代表的是需要找的数
while(m–){
int x;
scanf(“%d”,&x);
int l=0,r = n-1;
//定义l为左边界,r为右边界,因为在数组内所以是从0开始的
//只要左右边界之间还有数字这个循环就仍然可以执行
while (l < r){
int mid = l + r >> 1;
//check函数( q[mid] >= x)用来检验这个数是否符合要求的,符合返回true,不符合返回false
if(q[mid] >= x) r = mid; //说明为[l,mid]
else l = mid +1; //否则为[mid+1,r]
}
//在这里经过上面的循环l= r了已经,因为只有在二者相等的时候才能结束上述的循环
if(q[l] != x) cout << "-1 -1 " << endl;
//说明找到的点的值与实际的值不相等(不是因为二分法找不出来,二分法可以找出来,只是是数组本身数字的设置的问题)
else{
cout << l << ' ' ; //这个l是指那个数字的左边界
//二分模版二
int l = 0,r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(q[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;//这个l经过了初始化和循环后指的是右边界
}
}