提交时间:2025-02-10 20:39:39
运行 ID: 36317
#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[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; 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; scanf("%lld%lld",&n,&q); for (int i=1;i<=n;i++){ // cin>>x[i]; scanf("%lld",&x[i]); insert(x[i],i); mp[x[i]]=i; } while (q--){ // cin>>a>>b; scanf("%lld%lld",&a,&b); if (n==1){ // cout<<-1<<endl; printf("-1\n"); } else if (mp[a^b]){ if (mp[a^b]==n){ // cout<<n-1<<endl; printf("%lld\n",n-1); } else{ // cout<<mp[a^b]<<endl; printf("%lld\n",mp[a^b]); } } 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; printf("%lld\n",ans); } else{ node u=findmin(a),v=findmax(a); if (u.z>b or v.z<b){ // cout<<-1<<endl; printf("-1\n"); } else{ // cout<<find(u.wz,v.wz)<<endl; printf("%lld\n",find(u.wz,v.wz)); } } } return 0; }