#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int n,Q;
int a[maxn],dep[maxn],fa[maxn][50],lg[maxn],siz[maxn];
int dfn[maxn]; //dfs序
int wei[maxn],tot; //每个点在dfs序中的位置
vector<int>p[maxn];
void dfs(int x,int father){
a[x]^=a[father];
dfn[++tot]=x;
wei[x]=tot;
siz[x]=1;
fa[x][0]=father;
dep[x]=dep[father]+1;
for(int i=1;i<=lg[dep[x]-1];i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=0;i<p[x].size();i++){
int y=p[x][i];
if(y==father)continue;
dfs(y,x);
siz[x]+=siz[y];
}
}
int LCA(int x,int y){
if(dep[y]>dep[x])swap(x,y);
while(dep[x]>dep[y])
x=fa[x][lg[dep[x]-dep[y]]];
if(x==y)return x;
for(int i=lg[dep[x]];i>=0;i--)
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
return fa[x][0];
}
int w[maxn],lazy[maxn];
void pushup(int u){
w[u]=w[u*2]^w[u*2+1];
}
void build(int u,int L,int R){
if(L==R){
w[u]=a[dfn[L]];
return;
}
int mid=(L+R)/2;
build(u*2,L,mid-1);
build(u*2+1,mid,R);
pushup(u);
}
bool InRange(int L,int R,int l,int r){
return l<=L&&R<=r;
}
bool OutofRange(int L,int R,int l,int r){
return r<=L||R<=l;
}
void maketag(int u,int L,int R,int x){
int len=R-L+1;
lazy[u]^=x;
if(len%2==1)w[u]^=x;
}
void pushdown(int u,int L,int R){
int mid=(L+R)/2;
maketag(u*2,L,mid,lazy[u]);
maketag(u*2+1,mid+1,R,lazy[u]);
lazy[u]=0;
}
int query(int u,int L,int R,int x){
if(L==R)return w[u];
int mid=(L+R)/2;
pushdown(u,L,R);
if(x<=mid)return query(u*2,L,mid,x);
else return query(u*2+1,mid+1,R,x);
}
void update(int u,int L,int R,int l,int r,int x){ //将l~r都异或上x
if(OutofRange(L,R,l,r))return;
if(InRange(L,R,l,r)){
maketag(u,L,R,x);
return;
}
int mid=(L+R)/2;
pushdown(u,L,R);
update(u*2,L,mid,l,r,x);
update(u*2+1,mid+1,R,l,r,x);
pushup(u);
}
int main() {
cin>>n>>Q;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
p[u].push_back(v);
p[v].push_back(u);
}
for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
dfs(1,0);
build(1,1,n);
memset(lazy,-1,sizeof(lazy));
while(Q--){
int opt;
cin>>opt;
if(opt==1){
int x,y;
cin>>x>>y;
update(1,1,n,x,x+siz[x]-1,y);
}
if(opt==2){
int x,y;
cin>>x>>y;
int lca=LCA(x,y);
int nx=wei[x],ny=wei[y],nlca=wei[fa[lca][0]];
cout<<query(1,1,n,nx)^query(1,1,n,ny)<<endl;
//=query(1,1,n,nx)^query(1,1,n,ny)^query(1,1,n,nlca)^query(1,1,n,nlca)
}
}
return 0;
}
/*
5 3
2 1 3 2 2
1 2
2 3
2 4
1 5
2 2 5
*/