#include<bits/stdc++.h>
using namespace std;
struct NODE{int fa,son[2],xs,val;bool tag;}tr[100005];int st[100005];
void pushUp(int x){tr[x].xs=tr[tr[x].son[0]].xs^tr[tr[x].son[1]].xs^tr[x].val;}
void rever(int x){swap(tr[x].son[0],tr[x].son[1]);tr[x].tag^=1;}
void pushDown(int x){if(!tr[x].tag)return;if(tr[x].son[0])rever(tr[x].son[0]);if(tr[x].son[1])rever(tr[x].son[1]);}
bool nroot(int x){return tr[tr[x].fa].son[0]==x||tr[tr[x].fa].son[1]==x;}
void rotate(int x);
void splay(int x);
void acess(int x){for(int y=0;x;y=x,x=tr[x].fa)splay(x),tr[x].son[1]=y,pushUp(x);}
void makeRt(int x){acess(x);splay(x);rever(x);}
void split(int x,int y){makeRt(x);acess(y);splay(y);}
int getRt(int x){acess(x);splay(x);while(tr[x].son[0])x=tr[x].son[0];splay(x);return x;}
void link(int x,int y){makeRt(x);if(getRt(y)==x)return;tr[x].fa=y;return;}
void del(int x,int y)
{
makeRt(x);if(getRt(y)!=x||tr[y].fa!=x||tr[y].son[1])return;
tr[y].fa=0;tr[x].son[1]=0;pushUp(x);
}
void update(int x,int val){makeRt(x);tr[x].xs=val;pushUp(x);}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&tr[i].xs),tr[i].val=tr[i].xs;
for(int i=1;i<=m;i++)
{
int op,x,y;scanf("%d%d%d",&op,&x,&y);
if(op==0)split(x,y),printf("%d\n",tr[y].xs);
if(op==1)link(x,y);
if(op==2)del(x,y);
if(op==3)splay(x),tr[x].val=y,pushUp(x);
}
}
void rotate(int x)
{
int y=tr[x].fa,z=tr[y].fa;bool ty=(tr[z].son[1]==y),tx=(tr[y].son[1]==x);
int w=tr[x].son[tx^1];
if(nroot(y))tr[z].son[ty]=x;if(w)tr[w].fa=y;tr[y].son[tx]=w;tr[x].son[tx^1]=y;tr[y].fa=x;tr[x].fa=z;
pushUp(y);pushUp(x);
}
void splay(int x)
{
int t=x,top=0;st[++top]=t;
while(nroot(t))st[++top]=t=tr[t].fa;
for(int i=top;i>=1;i--)pushDown(st[i]);
while(nroot(x))
{
int y=tr[x].fa,z=tr[y].fa;
if(nroot(y))rotate((tr[z].son[0]==y)^(tr[y].son[0]==x)?x:y);
rotate(x);
}
}
WA,求助大佬,谢谢!