咕咕咕0分求助,4wa6re,/kkl
#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
struct EDGE
{
int v,next,quan;
}edge[maxn*2];
int ind[maxn];
int sz[maxn*33*2];
int ch[maxn*33*2][2];
int tma[maxn],tmb[maxn];
int fa[maxn][23];
int rt1[maxn],rt2[maxn];
int n,m;
int ww[maxn];
int tot=0,ttt=0,cnt=0;
void add(int aa,int bb)
{
tot++;
edge[tot].v=bb;
edge[tot].next=ind[aa];
ind[aa]=tot;
}
void psup(int x)
{
sz[x]=sz[ch[x][0]]+sz[ch[x][1]];
}
int dep[maxn];
void modi(int &x,int pre,int shu,int wei)
{
// cerr<<ttt<<endl;
if(x==0)x=++ttt;
sz[x]=sz[pre];
if(wei<0)
{
sz[x]++;
return;
}
int w=((shu>>wei)&1);
ch[x][!w]=ch[pre][!w];
modi(ch[x][w],ch[pre][w],shu,wei-1);
psup(x);
}
void dfs(int x,int fx)
{
// cerr<<x<<endl;
if(x==6)
int my=-1;
tma[x]=++cnt;
dep[x]=dep[fx]+1;
fa[x][0]=fx;
modi(rt1[tma[x]],rt1[tma[x]-1],ww[x],31);
modi(rt2[x],rt2[fx],ww[x],31);
for(int i=ind[x];i!=-1;i=edge[i].next)
{
if(fx==edge[i].v)continue;
dfs(edge[i].v,x);
}
tmb[x]=cnt;
}
int que(int nl,int nr,int x,int wei)
{
if(wei<0)return 0;
int w=((x>>wei)&1);
if(wei==1)
int my=-1;
if(sz[ch[nr][!w]]-sz[ch[nl][!w]])
return (1<<wei)|que(ch[nl][!w],ch[nr][!w],x,wei-1);
else return que(ch[nl][w],ch[nr][w],x,wei-1);
}
void wk()
{
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
}
int lca(int x,int y)
{
int i;
if(dep[x]<dep[y])swap(x,y);
for(i=20;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
if(x==y)return x;
for(i=20;i>=0;i--)
if(fa[x][i]==fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
return fa[x][0];
}
int main()
{
freopen("e.in","r",stdin);
freopen("e.out","w",stdout);
int i,aa,bb,cc,opt;
scanf("%d%d",&n,&m);
memset(ind,-1,sizeof(ind));
for(i=1;i<=n;i++)
scanf("%d",&ww[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&aa,&bb);
add(aa,bb);
add(bb,aa);
}
dfs(1,0);
wk();
for(i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d",&aa,&bb);
cout<<que(rt1[tma[aa]-1],rt1[tmb[aa]],bb,31)<<endl;
}
else
{
scanf("%d%d%d",&aa,&bb,&cc);
int gz=fa[lca(aa,bb)][0];
cout<<max(que(rt2[gz],rt2[aa],cc,31),que(rt2[gz],rt2[bb],cc,31))<<endl;
}
}
return 0;
}