总算找到个能看懂的了,orz Lavender。
#define INF 2147483647#define N 100001#define MAXBIT 31int root[N],ch[N*(MAXBIT+1)][2],sz[N*(MAXBIT+1)],tot;int query(int L,int R,int W)//询问a[L...R]中W与其的最大异或值{ int ans=0; L=root[L];R=root[R+1]; for(int i=MAXBIT;i>=1;--i) { int Bit=((W>>(i-1)&1)^1); if(sz[ch[R][Bit]]-sz[ch[L][Bit]]==0) Bit^=1; else ans+=1<<(i-1); R=ch[R][Bit]; L=ch[L][Bit]; } return ans;}void add(int now,int W)//先add(1,0),再add(2...n+1,a[1...n]){ int old=root[now-1]; root[now]=++tot; now=root[now]; for(int i=MAXBIT;i>=1;--i) { int Bit=((W>>(i-1))&1); sz[now]=sz[old]+1; ch[now][Bit^1]=ch[old][Bit^1]; ch[now][Bit]=++tot; now=ch[now][Bit]; old=ch[old][Bit]; } sz[now]=sz[old]+1;}