傳送門
【題目分析】
因爲所有的操作都是對於全局的,所以可以單獨把所有操作的值x存下來,每次詢問的時候帶到Trie上跑就好了。
(wsm會有什麼權值線段樹這種東西?
【代碼~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e7+10;
int n,q;
int tag;
int siz[MAXN],vis[MAXN],son[MAXN][2],tot;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),(p1==p2))?EOF:*p1++;
}
#define getchar nc
inline int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void insert(int num){
int now=0;
for(int i=20;i!=-1;--i){
int k=(num>>i)&1;
if(!son[now][k]) son[now][k]=++tot;
now=son[now][k];
++siz[now];
}
}
int query(){
int now=0,ret=0;
for(int i=20;i!=-1;--i){
int k=(tag>>i)&1;
if(!son[now][k]) return ret;
if(siz[son[now][k]]==(1<<i)) ret|=(1<<i),now=son[now][k^1];
else now=son[now][k];
}
return ret;
}
int main(){
n=Read(),q=Read();
for(int i=1;i<=n;++i){
int x=Read();
if(vis[x]) continue;
insert(x),vis[x]=1;
}
while(q--){
int x=Read();
tag^=x;
cout<<query()<<'\n';
}
}