不知道为什么RE
#include<bits/stdc++.h>
#define MAXN 1000005
typedef long long ll;
using namespace std;
ll n,m,tot,q[MAXN * 2];
struct node{
ll ch[2],f,res,val,sum;
}t[MAXN];
ll pp(ll rt){swap(t[rt].ch[0] , t[rt].ch[1]);t[rt].res = (t[rt].res ^ 1);}
ll push_down(ll rt){if(!t[rt].res)return 0;pp(t[rt].ch[0]) , pp(t[rt].ch[1]);t[rt].res = 0;}
ll up(ll rt){t[rt].sum = (t[t[rt].ch[0]].sum ^ t[t[rt].ch[1]].sum ^ t[rt].val);}
ll get(ll rt){return (t[t[rt].f].ch[1] == rt);}
ll checkrt(ll rt){return (t[rt].f && (t[t[rt].f].ch[0] == rt || t[t[rt].f].ch[1] == rt));}
int rote(ll rt){
ll ff = t[rt].f , gg = t[ff].f , d = get(rt) , cc = t[rt].ch[d ^ 1];
if(checkrt(ff))t[gg].ch[get(ff)] = rt;
t[ff].f = rt , t[rt].ch[d ^ 1] = ff , t[rt].f = gg , t[cc].f = ff , t[ff].ch[d] = cc;
up(ff) , up(rt) , up(gg);
}
int splay(ll rt){
ll x = rt , zz = 0;
q[++zz] = x;
while(checkrt(x))x = t[x].f , q[++zz] = x;
while(zz){
push_down(q[zz]);
zz--;
}
for(ll ff = t[rt].f ; checkrt(rt) ; rote(rt)){
if(checkrt(ff = t[rt].f)){
if(get(ff) == get(rt))rote(ff);
else rote(rt);
}
}
up(rt);
}
ll access(ll rt){for(ll y = 0 ; rt ; rt = t[y = rt].f)splay(rt) ,t[rt].ch[1] = y;}
ll makert(ll rt){
access(rt);
splay(rt);
pp(rt);
}
ll foundrt(ll x){
access(x);
splay(x);
while(t[x].ch[0])x = t[x].ch[0];
splay(x);
return x;
}
ll split(ll x , ll y){
makert(x);
access(y);
splay(y);
}
ll link(ll x , ll y){
if(foundrt(x) == foundrt(y))return 0;
makert(x);
t[x].f = y;
}
ll cut(ll x , ll y){
makert(x);
if(foundrt(x) != foundrt(y) || t[y].f != x || (t[x].ch[get(y)] != y))return 0;
t[x].ch[get(y)] = 0;
t[y].f = 0;
}
int main(){
cin>>n>>m;
ll tp,x,y;
for(int i = 1 ; i <= n ; i++){
scanf("%lld" , &x);tot++;
t[tot].val = x;
}
for(ll i = 1 ; i <= m ; i++){
scanf("%lld%lld%lld" , &tp , &x , &y);
if(tp == 0){
split(x , y);
cout<<t[y].sum<<endl;
}
if(tp == 1)link(x , y);
if(tp == 2)cut(x , y);
if(tp == 3){
makert(x);
t[x].val = y;
up(x);
}
}
}