https://www.luogu.com.cn/problem/P6098
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
///线段树部分
LL new_w[maxn];
struct Tree{
LL l,r,sum;
}tree[maxn*4];
void push_up(LL p){
tree[p].sum=tree[p*2].sum^tree[p*2+1].sum;
}
void build(LL p,LL l,LL r){
tree[p].l=l;tree[p].r=r;tree[p].sum=0;
if(l==r){tree[p].sum=new_w[l];return;}
LL mid=(l+r)>>1;
///debug(mid);
build(p*2,l,mid);
build(p*2+1,mid+1,r);
push_up(p);
}
void modify(LL p,LL l,LL r,LL d){
if(l<=tree[p].l&&r>=tree[p].r){
tree[p].sum=d;
return;
}
LL mid=(tree[p].l+tree[p].r)>>1;
if(l<=mid) modify(p*2,l,r,d);
if(r>mid) modify(p*2+1,l,r,d);
push_up(p);
}
LL query(LL p,LL l,LL r){
if(l<=tree[p].l&&r>=tree[p].r){
return tree[p].sum;
}
LL ans=0;
LL mid=(tree[p].l+tree[p].r)>>1;
if(l<=mid) ans^=query(p*2,l,r);
if(r>mid) ans^=query(p*2+1,l,r);
return ans;
}
void shuchu(LL p,LL l,LL r){
if(tree[p].l==tree[p].r)
{
cout<<tree[p].sum<<" ";
return;
}
LL mid=(tree[p].l+tree[p].r)>>1;
shuchu(p*2,l,mid);
shuchu(p*2+1,mid+1,r);
}
///树链剖分
LL siz[maxn],son[maxn],fa[maxn],dep[maxn],top[maxn];
LL a[maxn];
LL id[maxn],tot=0;
vector<LL>g[maxn];
void predfs(LL u,LL father){
siz[u]=1;dep[u]=dep[father]+1;
fa[u]=father;
for(LL i=0;i<g[u].size();i++){
LL v=g[u][i];
if(v==father) continue;
predfs(v,u);///0.0又忘了
siz[u]+=siz[v];
if(siz[v]>siz[son[u]]){
son[u]=v;
}
}
}
void dfs(LL u,LL topx){
top[u]=topx;
id[u]=++tot;
new_w[tot]=a[u];
///cout<<"new_w["<<tot<<"]="<<new_w[tot]<<endl;
if(!son[u]) return;
dfs(son[u],topx);
for(LL i=0;i<g[u].size();i++){
LL v=g[u][i];
if(v==fa[u]||v==son[u]) continue;
dfs(v,v);
}
}
LL path_query(LL u,LL v){
LL ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans^=query(1,id[top[u]],id[u]);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans^=query(1,id[u],id[v]);
///debug(ans);
return ans;
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL n,m;cin>>n>>m;
for(LL i=1;i<=n;i++){
cin>>a[i];
}
for(LL i=1;i<n;i++){
LL u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
predfs(1,0);
dfs(1,1);
build(1,1,n);
/// shuchu(1,1,n);
while(m--)
{
LL op;cin>>op;
if(op==1){
LL e,v;cin>>e>>v;
modify(1,id[e],id[e],v);
}
else if(op==2){
LL i,j;cin>>i>>j;
cout<<path_query(i,j)<<endl;
}
}
return 0;
}