提交时间:2025-02-10 17:15:46

运行 ID: 36280

#include<bits/stdc++.h> #define int long long using namespace std; void read(int &x){ x=0; char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); } int n,q,x[1000005],a,b; int ch[1000005<<5][2],mn[1000005<<5],mx[1000005<<5],tot; void insert(int x,int i){ int p=0; for(int i=30;i>=0;i--){ if(!ch[p][x>>i&1])ch[p][x>>i&1]=++tot; // cout<<p<<" "<<(x>>i&1)<<endl; p=ch[p][x>>i&1]; } if(!mn[p])mn[p]=i; else mn[p]=min(i,mn[p]); mx[p]=max(i,mx[p]); } int qumx(int x){ int p=0; // cout<<x<<endl; for(int i=30;i>=0;i--){ // cout<<p<<" "<<(x>>i&1)<<" "<<ch[p][(x>>i&1)]<<" "<<ch[p][!(x>>i&1)]<<endl; if(!ch[p][!(x>>i&1)])p=ch[p][x>>i&1]; else p=ch[p][!(x>>i&1)]; } return mx[p]; } int qumn(int x){ int p=0; for(int i=30;i>=0;i--){ if(!ch[p][(x>>i&1)])p=ch[p][!(x>>i&1)]; else p=ch[p][x>>i&1]; } return mn[p]; } int f(int x){ return (x^a)-b; } void slv(){ read(n),read(q); for(int i=1;i<=n;i++)read(x[i]),insert(x[i],i); while(q--){ read(a),read(b); if(n==1){ cout<<-1<<endl; continue; } int l=qumx(a),r=qumn(a); if(l>r)swap(l,r); if(f(x[l])*f(x[r])>0){ cout<<-1<<endl; continue; } while(l+1<r){ // cout<<l<<" "<<r<<" "<<f(l)<<" "<<f(r)<<endl; int mid=l+r>>1; if(f(x[mid])*f(x[l])<=0)r=mid; else l=mid; } cout<<l<<endl; } } int main(){ // int T;cin>>T;while(T--) slv(); return 0; }