#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=2e5+7;
ll head[Maxn],tot,N,Q,w[Maxn],wt[Maxn],id[Maxn],top[Maxn],fa[Maxn],sz[Maxn],son[Maxn],dep[Maxn],cnt;
struct edge1{
ll u,v,Next;
}Edge[Maxn<<1];
inline void add(ll u,ll v){
Edge[++tot]=(edge1){u,v,head[u]},head[u]=tot;
}
void dfs_dep(ll u,ll father){
fa[u]=father;
dep[u]=dep[father]+1;
sz[u]=1;
for(ll i=head[u];i;i=Edge[i].Next){
ll v=Edge[i].v;
if(v==father) continue;
dfs_dep(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs_new(ll u,ll topx){
id[u]=++cnt;
wt[cnt]=w[u];
top[u]=topx;
if(son[u]) dfs_new(son[u],topx);
for(ll i=head[u];i;i=Edge[i].Next){
ll v=Edge[i].v;
if(v!=son[u]&&v!=fa[u]) dfs_new(v,v);
}
}
struct TREE{
ll num,l,r,tag;
}tree[Maxn<<2];
inline void pushup(ll node){
tree[node].num=(tree[node<<1].num^tree[node<<1|1].num);
}
inline void buildtree(ll node,ll l,ll r){
tree[node].l=l,tree[node].r=r;
if(l==r){
tree[node].num=wt[l];
return ;
}
ll mid=l+r>>1;
buildtree(node<<1,l,mid);
buildtree(node<<1|1,mid+1,r);
pushup(node);
}
inline void modify(ll node,ll x,ll val){
if(tree[node].l==tree[node].r){
tree[node].num=val;
return ;
}
ll mid=tree[node].l+tree[node].r>>1;
if(x<=mid) modify(node<<1,x,val);
else modify(node<<1|1,x,val);
pushup(node);
}
inline ll query(ll node,ll l,ll r){
if(tree[node].l==tree[node].r) return tree[node].num;
ll mid=tree[node].l+tree[node].r>>1,ans=0;
if(l<=mid) ans=ans^query(node<<1,l,r);
if(r>mid) ans=ans^query(node<<1|1,l,r);
return ans;
}
inline void updateRange(ll x,ll val){
modify(1,id[x],val);
}
inline ll queryRange(ll x,ll y){
ll ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=ans^query(1,id[x],id[top[x]]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans=ans^query(1,id[x],id[y]);
return ans;
}
int main(){
scanf("%lld%lld",&N,&Q);
for(ll i=1;i<=N;i++) scanf("%lld",&w[i]);
for(ll i=1,u,v;i<=N-1;i++)
scanf("%lld%lld",&u,&v),add(u,v),add(v,u);
dfs_dep(1,0);
dfs_new(1,1);
buildtree(1,1,N);
while(Q--){
ll opt,x,y;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt==1) updateRange(x,y);
if(opt==2) printf("%lld\n",queryRange(x,y));
}
return 0;
}