提交时间:2025-02-10 20:32:29
运行 ID: 36311
#include <bits/stdc++.h> #define int long long using namespace std; struct node{ int z,wz; }; map<int,int> mp; int n,q,x[1000005],a,b,t[30000005][2],jl[3000005],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; return ; } node 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]}; } node 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(){ cin>>n>>q; for (int i=1;i<=n;i++){ cin>>x[i]; insert(x[i],i); mp[x[i]]=i; } while (q--){ cin>>a>>b; if (n==1){ cout<<-1<<endl; } else if (mp[a^b]){ if (mp[a^b]==n){ cout<<n-1<<endl; } else{ cout<<mp[a^b]<<endl; } } else if(n<=1000 and q<=1000){ int ans=-1; for (int i=1;i<=n-1;i++){ if (((x[i]^a)-b)*((x[i+1]^a)-b)<=0){ ans=i; break; } } cout<<ans<<endl; } else{ node u=findmin(a),v=findmax(a); if (u.z>b or v.z<b){ cout<<-1<<endl; } else{ cout<<find(u.wz,v.wz)<<endl; } } } return 0; }