#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
#define int long long
#define rep for(int i=head[u],v;i,v=to[i];i=nxt[i])
using namespace std;
const int maxn=6e5+10;
int head[maxn],nxt[maxn],to[maxn],w[maxn],tot;
int dep[maxn],hson[maxn],siz[maxn],top[maxn],fa[maxn];
int hsiz[maxn],sum,f[maxn],a[maxn],rt,vis[maxn];
int fr[maxn];
vector<int>c[2][maxn];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void add(int u,int v){
nxt[++tot]=head[u],to[head[u]=tot]=v;
}
void dfs1(int u,int lst,int op){
if(op)dep[u]=dep[lst]+1,fa[u]=lst,dep[1]=0;
siz[u]=1;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==lst||vis[v])continue;
dfs1(v,u,op);
siz[u]+=siz[v];
if(op)if(siz[v]>siz[hson[u]]) hson[u]=v;
hsiz[u]=max(hsiz[u],siz[v]);
}
hsiz[u]=max(hsiz[u],sum-hsiz[u]);
if(hsiz[u]<hsiz[rt]) rt=u;
}
void dfs2(int u,int topf){
top[u]=topf;
if(!hson[u]) return ;
dfs2(hson[u],topf);
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==hson[u]||v==fa[u])continue;
dfs2(v,v);
}
}
int dis(int u,int v){
int uu=u,vv=v;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}
int lca=dep[u]<dep[v]?u:v;
return dep[uu]+dep[vv]-2*dep[lca];
}
void divide(int u){
//cout<<u<<endl;
vis[u]=1;
siz[u]=sum+1;
c[0][u].resize(siz[u]+1);
c[1][u].resize(siz[u]+1);
rep if(!vis[v]){
sum=siz[v];
rt=0;
dfs1(v,-1,0);
dfs1(rt,-1,0);
fr[rt]=u;
divide(rt);
}
}
void upd(int u,int op,int x,int w){
x++;
while(x<=siz[u]){
c[op][u][x]+=w;
x+=lowbit(x);
}
}
int get(int u,int op,int x){
x++;
int res=0;
x=min(x,siz[u]);
while(x){
res+=c[op][u][x];
x-=lowbit(x);
}
return res;
}
void modify(int u,int w){
//cout<<w<<endl;
for(int i=u;i;i=fr[i]) upd(i,0,dis(u,i),w);//,cout<<dis(u,i)<<" "<<u<<" "<<i<<endl;
for(int i=u;fr[i];i=fr[i]) upd(i,1,dis(u,fr[i]),w);//cout<<dis(u,fr[i])<<" "<<u<<" "<<i<<endl;
}
signed main(){
int n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v);add(v,u);
}
rt=0;
hsiz[rt]=0x3f3f3f3f;
sum=n;
dfs1(1,-1,1);
dfs2(1,1);
dfs1(rt,-1,0);
divide(rt);
int ans=0;
for(int i=1;i<=n;i++) modify(i,a[i]);
for(int i=1;i<=m;i++){
int op=read(),x=read()^ans,y=read()^ans;
if(!op){
ans=0;
ans+=get(x,0,y);
for(int i=x;fr[i];i=fr[i]){
int d=dis(x,fr[i]);
//cout<<get(fr[i],0,y-d)<<endl;
if(y>=d) ans+=get(fr[i],0,y-d)-get(i,1,y-d);
}
cout<<ans<<endl;
}
else modify(x,y-a[x]),a[x]=y;
}
}