Submit Time:2025-02-10 21:17:52
运行 ID: 36326
#include<bits/stdc++.h> using namespace std; const int N=1e6+10,H=30; int n,q,x[N],ch[N<<5][3],tot; vector<int> bt; void read(int &x){ int f=1;x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} x*=f; } void out(int x){ if(x<10) putchar(x+'0'); else{ out(x/10); putchar((x%10)+'0'); } } int mknode(){ ++tot; ch[tot][1]=ch[tot][0]=0; return tot; } void add(int x,int i){ bt.clear(); for(int i=1;i<=H;i++){ bt.push_back(x&1); x>>=1; } int p=1; for(int i=bt.size()-1;~i;--i){ if(!ch[p][bt[i]]) ch[p][bt[i]]=mknode(); p=ch[p][bt[i]]; } ch[p][2]=i; } int Max(int x) { int p=1; bt.clear(); for(int i=1;i<=H;i++){ bt.push_back(x&1); x>>=1; } for(int i=bt.size()-1;~i;--i){ if(ch[p][1-bt[i]]) p=ch[p][1-bt[i]]; else p=ch[p][bt[i]]; } return ch[p][2]; } int Min(int x){ int p=1; bt.clear(); for(int i=1;i<=H;i++){ bt.push_back(x&1); x>>=1; } for(int i=bt.size()-1;~i;--i){ if(ch[p][bt[i]]) p=ch[p][bt[i]]; else p=ch[p][1-bt[i]]; } return ch[p][2]; } bool f(int u,int v,int a,int b){ return (1ll*((u^a)-b)*((v^a)-b))<=0ll; } int main(){ read(n),read(q); int rt=mknode(); for(int i=1;i<=n;i++){ read(x[i]); add(x[i],i); } while(q--){ int a,b,flag=0; read(a),read(b); if(n==1){ puts("-1"); continue; } int l=Min(a),r=Max(a),mid=0; if(l>r) swap(l,r); if(!f(x[l],x[r],a,b)) puts("-1"); else{ while(r-l>1){ mid=(l+r)>>1; if(f(x[l],x[mid],a,b)) r=mid; else l=mid; } if(f(x[l],x[l+1],a,b)) out(l),putchar('\n'); else out(r),putchar('\n'); } } return 0; }