复制代码
#include<iostream>
using namespace std;

const int N = 1000010;
int n,m;

int q[N];

//二分 把一个区间分成性质互相对立的区间
//其中,左半部分的性质最右端的数,是这满足这性质的最后一点,
//check中间索引的数比较这个数 if大,则x位置就在左边,区间变为l-mid 可能等于mid
//if小  则 X 位置在mid+1 -- r (原来区间是从小到大排序的,所以当q[mid]小时,则 x 比不可能在mid 上)

//右半部分的性质最左端的数,满足这性质的第一个点
//if q[mid] > x 则 x的位置就在mid的左侧,区间在l--mid-1 else x的位置就在mid的右侧 区间在mid--r 
int main(){
    scanf("%d,%d",&n,&m);
    
    for(int i = 0; i< n ;i ++) scanf("%d",&q[i]);
    

    // 左边界
    while(m--){
        
        int x;
        scanf("%d",&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[l] !=x ) cout<<"-1 -1"<<endl;
        else{
            cout<<l<<' ';
            
            //右边界
            int l = 0 , r = n -1;
            
            while(l < r ){
                int mid = r + l +1 >> 1;
                if(q[mid] <= x ) l =mid;
                else r = mid -1 ;
            }
            cout<<l<<endl;
        }
        
    }
    return 0;
    
}
复制代码