提交时间:2025-02-11 10:18:30
运行 ID: 36351
#include<bits/stdc++.h> using namespace std; const int N = 3e7+10; int n,q,x[N],Q[N][2],now,a[N]; namespace IO{ char ibuf[(1<<20)+1],*iS,*iT; #if ONLINE_JUDGE #define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++) #else #define gh() getchar() #endif inline long long read(){ char ch=gh(); long long x=0; bool t=0; while(ch<'0'||ch>'9') t|=ch=='-',ch=gh(); while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh(); return t?-x:x; } inline char getc(){ char ch=gh(); while(ch<'a'||ch>'z') ch=gh(); return ch; } } using IO::read; using IO::getc; struct T{ int ch[2]; int bz; }tri[N]; void insert(int y,int id){ int len=0; while(y){ a[++len]=y&1; y=y>>1; } for(int i=len;i>=len/2+1;i--){ swap(a[i],a[len-i+1]); } for(int i=len;i>=1;i--){ a[i+32-len]=a[i]; } for(int i=1;i<=32-len;i++){ a[i]=0; } int cur=0; for(int i=1;i<=32;i++){ if(tri[cur].ch[a[i]]==0){ now++; tri[cur].ch[a[i]]=now; cur=now; } else{ cur=tri[cur].ch[a[i]]; } } tri[cur].bz=id; } int find(int y){ int len=0; while(y){ a[++len]=y&1; y=y>>1; } for(int i=len;i>=len/2+1;i--){ swap(a[i],a[len-i+1]); } for(int i=len;i>=1;i--){ a[i+32-len]=a[i]; } for(int i=1;i<=32-len;i++){ a[i]=0; } int cur=0; int ans=0; for(int i=1;i<=now;i++){ if(tri[cur].ch[!a[i]]!=0){ cur=tri[cur].ch[!a[i]]; } else if(tri[cur].ch[a[i]]!=0){ cur=tri[cur].ch[a[i]]; } else{ ans=tri[cur].bz; break; } } return ans; } int find2(int y){ int len=0; while(y){ a[++len]=y&1; y=y>>1; } for(int i=len;i>=len/2+1;i--){ swap(a[i],a[len-i+1]); } for(int i=len;i>=1;i--){ a[i+32-len]=a[i]; } for(int i=1;i<=32-len;i++){ a[i]=0; } int cur=0; int ans=0; for(int i=1;i<=now;i++){ if(tri[cur].ch[a[i]]!=0){ cur=tri[cur].ch[a[i]]; } else if(tri[cur].ch[!a[i]]!=0){ cur=tri[cur].ch[!a[i]]; } else{ ans=tri[cur].bz; break; } } return ans; } int main(){ //freopen("function.in","r",stdin); //freopen("function.out","w",stdout); n=read(); q=read(); for(int i=1;i<=n;i++){ x[i]=read(); insert(x[i],i); } for(int i=1;i<=q;i++){ int ans=0; Q[i][0]=read(); Q[i][1]=read(); int maxn=find(Q[i][0]),minn=find2(Q[i][0]); long long tmp=(x[maxn]^Q[i][0])-Q[i][1],tmp2=(x[minn]^Q[i][0])-Q[i][1]; if(tmp*tmp2>0){ printf("-1\n"); continue; } if(n==1){ printf("-1\n"); continue; } int L,R,mid; if(maxn<minn){ L=maxn; R=minn; } else{ L=minn; R=maxn; } while(L<=R){ mid=(L+R)/2; tmp=(x[mid]^Q[i][0])-Q[i][1]; long long tmp2=(x[mid+1]^Q[i][0])-Q[i][1]; long long tmpl=(x[L]^Q[i][0])-Q[i][1]; if(tmp*tmp2<=0&&mid<n){ ans=mid; break; } if(tmpl*tmp<=0){ R=mid; } else{ L=mid; } if(L+1==R){ ans=L; break; } } printf("%d\n",ans); } return 0; }