//Author's Solution using for testing #include #include using namespace std; int a[10000000][2],ww[20],sz[10000000],type,root[600000],m,ind[10000000]; int ans,n,v,l,r,x; void add(int prev_root, int now_root, int x) { for (int i=18;i>=0;i--) { int edge=(x & (1 << i)); if (edge!=0) edge=1; v++; ww[i]=now_root; ind[v]=n; a[now_root][edge]=v; a[now_root][1-edge]=a[prev_root][1-edge]; sz[now_root]=sz[a[now_root][1-edge]]; now_root=v; prev_root=a[prev_root][edge]; } sz[now_root]+=sz[prev_root]+1; for (int i=0;i<=18;i++) sz[ww[i]]=sz[a[ww[i]][0]]+sz[a[ww[i]][1]]; } void findxor(int v, int l, int x) { for (int i=18;i>=0;i--) { int edge=(x & (1 << i)); if (edge!=0) edge=1; if (ind[a[v][1-edge]]>=l) { v=a[v][1-edge]; ans+=(1-edge)*(1 << i); } else { v=a[v][edge]; ans+=edge*(1 << i); } } } int findless(int v, int x) { int ans=0; for (int i=18;i>=0;i--) { int edge=(x & (1 << i)); if (edge!=0) edge=1; for (int j=0;j=0;i--) { for (int j=0;j<=1;j++) if (sz[a[vr][j]]-sz[a[vl][j]]