写的dfs序,56分,wa9~14
#include<iostream>
#include<vector>
using namespace std;
long long t[4*200005],qzh[200005],id[200005],w[200005],wd[200005],cnt,ed[200005],o[200005*4],f[200005][21],dep[200005];
vector<long long>e[200005];
void dfs(long long x,long long fa){
cnt++;
id[x]=cnt;
wd[cnt]=w[x];
qzh[cnt]=qzh[id[fa]]^w[x];
dep[x]=dep[fa]+1;
f[x][0]=fa;
for(long long i=1;i<=20;i++){
f[x][i]=f[f[x][i-1]][i-1];
}
for(long long i=0;i<e[x].size();i++){
if(e[x][i]!=fa)dfs(e[x][i],x);
}
ed[x]=cnt;
}
void build(long long l,long long r,long long z){
if(l==r){
t[z]=qzh[l];
return;
}
long long mid=(l+r)>>1;
build(l,mid,z<<1);
build(mid+1,r,z<<1|1);
t[z]=t[z<<1]^t[z<<1|1];
}
void pushdown(long long l,long long r,long long z){
if(o[z]){
int mid=(l+r)/2;
if((mid-l+1)%2)t[z<<1]^=o[z];
if((r-mid)%2)t[z<<1|1]^=o[z];
o[z<<1]^=o[z];
o[z<<1|1]^=o[z];
o[z]=0;
}
}
void xg(long long l,long long r,long long x,long long y,long long z,long long k){
if(l<=x&&y<=r){
t[z]^=k;
o[z]^=k;
return;
}
pushdown(l,r,z);
long long mid=(x+y)>>1;
if(mid>=l)xg(l,r,x,mid,z<<1,k);
if(mid<r)xg(l,r,mid+1,y,z<<1|1,k);
// t[z]=t[z<<1]^t[z<<1|1];
}
long long cx(long long l,long long r,long long x,long long z){
if(l==x&&r==x){
return t[z];
}
pushdown(l,r,z);
long long mid=(l+r)>>1;
if(mid>=x){
// t[z]=t[z<<1]^t[z<<1|1];
return cx(l,mid,x,z<<1);
}
else{
// t[z]=t[z<<1]^t[z<<1|1];
return cx(mid+1,r,x,z<<1|1);
}
}
long long lca(long long x,long long y){
if(dep[x]>dep[y])swap(x,y);
for(long long i=20;i>=0;i--){
if(dep[f[y][i]]>=dep[x])y=f[y][i];
}
// cout<<x<<" "<<y<<"\n";
if(x==y)return x;
for(long long 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 main(){
long long n,q;
cin>>n>>q;
for(long long i=1;i<=n;i++)cin>>w[i];
for(long long i=1;i<n;i++){
long long x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
build(1,n,1);
while(q--){
long long o,x,y;
cin>>o>>x>>y;
if(o==1)xg(id[x],ed[x],1,n,1,cx(1,n,id[x],1)^y);
else{
long long lc=lca(x,y);
if(lc==1)cout<<(cx(1,n,id[x],1)^cx(1,n,id[y],1)^cx(1,n,id[lc],1))<<"\n";
else cout<<(cx(1,n,id[x],1)^cx(1,n,id[y],1)^cx(1,n,id[lc],1)^cx(1,n,id[f[lc][0]],1))<<"\n";
}
}
return 0;
}