大佬们帮忙找找不同吧,初学可持久化trie,基本是对着第一篇题解写的,就是变量换了个名字,一直在WA,不知道哪里错了。空间已经开很大了,不知道为什么开10倍空间能多对两个点。
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
inline void read(int& x)
{
x=0;int y=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x=x*y;
}
int n,q;
struct node{
int to,nxt;
}e[N<<1];
int tot,head[N];
inline void add(int u,int v)
{
e[++tot].nxt=head[u];
e[tot].to=v;
head[u]=tot;
}
int w[N],dfn[N],tim,lst[N],rt1[N],rt2[N];
int f[N][21],ch[20000001][2],sz[N],dep[N];
int cnt;
void insert(int &rt,int val,int j)
{
ch[++cnt][1]=ch[rt][1],ch[cnt][0]=ch[rt][0];
sz[cnt]=sz[rt]+1;
rt=cnt;
if(j!=-1)insert(ch[rt][val>>j&1],val,j-1);
}
void dfs(int x,int fa)
{
dfn[x]=++tim,f[x][0]=fa,dep[x]=dep[fa]+1;
rt1[tim]=rt1[tim-1],rt2[x]=rt2[fa];
insert(rt1[tim],w[x],29);
insert(rt2[x],w[x],29);
for(int i=1;i<=20;i++)f[x][i]=f[f[x][i-1]][i-1];
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(y==fa)continue;
dfs(y,x);
}
lst[x]=tim;
}
inline int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(int i=20;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
int query(int r1,int r2,int val,int j)
{
if(j==-1)return 0;
int pos=(val>>j&1)^1;
if(sz[ch[r1][pos]]-sz[ch[r2][pos]])return query(ch[r1][pos],ch[r2][pos],val,j-1)|(1<<j);
else return query(ch[r1][pos^1],ch[r2][pos^1],val,j-1);
}
inline int Max(int x, int y) { return x > y ? x : y; }
int main(){
read(n),read(q);
for(int i=1;i<=n;i++)read(w[i]);
for(int i=1,x,y;i<n;i++)
{
read(x),read(y);
add(x,y),add(y,x);
}
dfs(1,0);
for(int i=1;i<=q;i++)
{
int op,x,y,z;
read(op);
if(op==1)
{
read(x),read(z);
printf("%d\n",query(rt1[lst[x]],rt1[dfn[x]-1],z,29));
}
if(op==2)
{
read(x),read(y),read(z);
int L=f[lca(x,y)][0];
printf("%d\n",Max(query(rt2[x],rt2[L],z,29),query(rt2[y],rt2[L],z,29)));
}
}
return 0;
}