Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
36352 | 23级徐泽厚 | 【S】T1 | C++ | 通过 | 100 | 3077 MS | 499520 KB | 2490 | 2025-02-11 10:19:27 |
#include <bits/stdc++.h> #define int long long using namespace std; struct node{ int z,wz; }; unordered_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(){ scanf("%lld%lld",&n,&q); for (int i=1;i<=n;i++){ scanf("%lld",&x[i]); insert(x[i],i); mp[x[i]]=i; } while (q--){ scanf("%lld%lld",&a,&b); if (n==1){ printf("-1\n"); } else if (mp[a^b]){ if (mp[a^b]==n){ printf("%lld\n",n-1); } else{ 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; } } printf("%lld\n",ans); } else{ node u=findmin(a),v=findmax(a); if (u.z>b or v.z<b){ printf("-1\n"); } else{ printf("%lld\n",find(u.wz,v.wz)); } } } return 0; }