RT,样例二WA了
#include<bits/stdc++.h>
#define N 1000005
#define isroot(p) (s[f[p]][0]!=p&&s[f[p]][1]!=p)
#define get(p) (p==s[f[p]][1])
using namespace std;
int n,m;
struct Link_Cut_Tree {
int f[N],s[N][2],Xor[N],tag[N],a[N];
void push_up(int p) {
Xor[p]=Xor[s[p][0]]^Xor[s[p][1]]^a[p];
}
void upd1(int p) {
tag[p]^=1;
swap(s[p][0],s[p][1]);
}
void push_down(int p) {
if(tag[p]) {
if(s[p][0])upd1(s[p][0]);
if(s[p][1])upd1(s[p][1]);
tag[p]=0;
}
}
void upd2(int p) {
if(!isroot(p))upd2(f[p]);
push_down(p);
}
void spin(int x) {
int y=f[x],z=f[f[x]],opt=get(x);
if(!isroot(y))s[z][get(y)]=x;
s[y][opt]=s[x][opt^1],f[s[x][opt^1]]=y;
s[x][opt^1]=y,f[y]=x,f[x]=z;
push_up(x),push_up(y);
}
void splay(int p) {
upd2(p);
for(int fa; fa=f[p],!isroot(p); spin(p))
if(!isroot(fa))spin(get(p)==get(fa)?fa:p);
}
int access(int x) {
int p;
for(p=0; x; p=x,x=f[x])
splay(x),s[x][1]=p,push_up(x);
return p;
}
void makeroot(int p) {
access(p);
splay(p);
upd1(p);
}
int find(int p) {
access(p),splay(p);
while(s[p][0])push_down(p),p=s[p][0];
splay(p);
return p;
}
void link(int x,int y) {
makeroot(x);
if(find(y)!=x)f[x]=y;
}
void cut(int x,int y) {
makeroot(x);
if(find(y)==x&&f[y]==x&&!s[y][0]){
f[y]=s[x][1]=0;
push_up(x);
}
}
void spilt(int x,int y){
makeroot(x),access(y),splay(y);
}
} t;
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&t.a[i]);
int opt,x,y;
while(m--){
scanf("%d%d%d",&opt,&x,&y);
if(opt==0)t.spilt(x,y),printf("%d\n",t.Xor[y]);
if(opt==1)t.link(x,y);
if(opt==2)t.cut(x,y);
if(opt==3)t.splay(x),t.a[x]=y;
}
}