看上去没有问题。
和 long long 没有关系。
#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
using namespace std;
int n,Q;
const int N=1e5+5;
int h[N],ne[N<<1],to[N<<1],idx;
int cnt,son[N],siz[N],dep[N],top[N],fa[N],dfn[N],rk[N];
int e[N];
struct tree{
int l,r,val;
}tr[N<<2];
void add(int a,int b){
to[++idx]=b;
ne[idx]=h[a];
h[a]=idx;
}
void dfs1(int x){
siz[x]=1,son[x]=-1;
for(int i=h[x];i!=-1;i=ne[i]){
int j=to[i];
if(j==fa[x]) continue;
dep[j]=dep[x]+1;
fa[j]=x;
dfs1(j);
siz[x]+=siz[j];
if(son[x]==-1||siz[j]>siz[son[x]]) son[x]=j;
}
}
void dfs2(int x,int tp){
top[x]=tp;
dfn[x]=++cnt;
rk[cnt]=x;
if(son[x]==-1) return ;
dfs2(son[x],tp);
for(int i=h[x];i!=-1;i=ne[i]){
int j=to[i];
if(j!=son[x]&&j!=fa[x]) dfs2(j,j);
}
}
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r;
if(l==r){
tr[id].val=e[rk[l]];
return ;
}
int mid=(l+r)>>1;
build(lid,l,mid);
build(rid,mid+1,r);
tr[id].val=tr[lid].val^tr[rid].val;
}
void modify(int id,int x,int v){
if(tr[id].l==tr[id].r){
tr[id].val=v;
return;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(x<=mid) modify(lid,x,v);
else modify(rid,x,v);
tr[id].val=tr[lid].val^tr[rid].val;
}
int query(int id,int l,int r){
if(tr[id].l==l&&tr[id].r==r) return tr[id].val;
int mid=(tr[id].l+tr[id].r)>>1;
if(r<=mid) return query(lid,l,r);
else if(l>mid) return query(rid,l,r);
else return query(lid,l,mid)^query(rid,mid+1,r);
}
int main(){
memset(h,-1,sizeof h);
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++) scanf("%d",&e[i]);
for(int i=1;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
dfs1(1),dfs2(1,1);
build(1,1,n);
while(Q--){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==1) modify(1,x,y);
else{
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans^=query(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
ans^=query(1,dfn[x],dfn[y]);
printf("%d\n",ans);
}
}
return 0;
}