Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
36240 | 22级廖思学 | 【S】T1 | C++ | 通过 | 100 | 3891 MS | 912752 KB | 1685 | 2025-02-10 15:53:24 |
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+10; int n,Q,x[N],a,cta,b; int son[N*30][5],cnt,pl[N*30]; void add(int id){ // cout<<"!!"<<id<<endl; int p=0,v; for(int i=30;i>=0;i--){ v=(x[id]>>i)&1; // cout<<x[id]<<" "<<(1<<i)<<" "<<v<<" "<<p<<" "; if(!son[p][v]){son[p][v]=++cnt;}//cout<<son[p][v]<<endl; p=son[p][v]; }//cout<<endl; // cout<<"!"<<id<<" "<<p<<endl; pl[p]=id; } int find_mx(){ // cout<<"!"<<endl; int p=0,v; for(int i=30;i>=0;i--){ v=(a>>i)&1;//cout<<a<<" "<<" "<<(1<<i)<<" "<<v<<" "<<(!v)<<" "; if(son[p][(!v)]){p=son[p][(!v)];} else p=son[p][v]; // cout<<p<<endl; }//cout<<endl; return pl[p]; } int find_mn(){ int p=0,v; for(int i=30;i>=0;i--){ v=(a>>i)&1; if(son[p][v]){p=son[p][v];} else p=son[p][!v]; } return pl[p]; } int f(int x){return (x^a)-b;} signed main(){ scanf("%lld%lld",&n,&Q); for(int i=1;i<=n;i++){ scanf("%lld",&x[i]); add(i); } // for(int i=0;i<=40;i++){cout<<son[i][0]<<" "<<son[i][1]<<endl;} while(Q--){ scanf("%lld%lld",&a,&b); if(n==1){printf("-1\n");continue;} int mx=find_mx(),mn=find_mn();//cout<<mx<<" "<<mn<<endl; if(mx>mn)swap(mx,mn); // cout<<f(x[mx])<<" "<<f(x[mn])<<endl; if(f(x[mx])*f(x[mn])>0){printf("-1\n");continue;} while(mn-mx>1){ int mid=(mx+mn)>>1; if(f(x[mid])*f(x[mx])<=0)mn=mid; else mx=mid; } printf("%lld\n",mx); } return 0; }