提交时间:2025-02-10 13:59:46
运行 ID: 36223
/*A zhengjie*/ #include<bits/stdc++.h> #define int long long using namespace std; struct A { int z,wz; }; int n,q,x[1000005],a,b,t[30000005][2],jl[30000005],tot=0; void insert(int y,int z) { int p=0; for(int i=30; i>=0; i--) { bool c=y&(1<<i); if(!t[p][c])t[p][c]=++tot; p=t[p][c]; } jl[p]=z; } A findmin(int y) { int p=0,ret=0; for(int i=30; i>=0; i--) { bool c=y&(1<<i); if(t[p][c])p=t[p][c]; else p=t[p][1-c],ret+=1<<i; } return {ret,jl[p]}; } A findmax(int y) { int p=0,ret=0; for(int i=30; i>=0; i--) { bool c=y&(1<<i); if(t[p][1-c])p=t[p][1-c],ret+=1<<i; else p=t[p][c]; } return {ret,jl[p]}; } int find(int l,int r) { int mid,ret; if(l<r) { while(l<=r) { mid=(l+r)/2; if((x[mid]^a)>b)ret=mid,r=mid-1; else l=mid+1; } return ret-1; } else { swap(l,r); while(l<=r) { mid=(l+r)/2; if((x[mid]^a)>b)ret=mid,l=mid+1; else r=mid-1; } return ret; } } signed main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>q; for(int i=1; i<=n; i++)cin>>x[i],insert(x[i],i); while(q--) { cin>>a>>b; A u=findmin(a),v=findmax(a); if(u.z>b||v.z<b)cout<<-1<<"\n"; else cout<<find(u.wz,v.wz)<<"\n"; } return 0; }