根可持久化線段樹差不多,這裡貼個板子 >w<
void insert(int &p,int q,int x,int i,int id) {
p=++tot, val[p]=id;
if(i==-1) return;
tr[p][0]=tr[q][0], tr[p][1]=tr[q][1];
int d=x>>i&1;
insert(tr[p][d],tr[q][d],x,i-1,id);
}
int ask(int x,int p,int l) {
int res=0;
dn(i,30,0) {
int d=(x>>i&1)^1;
if(tr[p][d]&&val[tr[p][d]]>=l) res|=(1<<i), p=tr[p][d];
else p=tr[p][d^1];
}
return res;
}