总算找到个能看懂的了,orz Lavender。
#define INF 2147483647 #define N 100001 #define MAXBIT 31 int 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; }