#include<cstdio>
#include<algorithm>
#define MN 200001
using namespace std;
int read_p,read_ca;
inline int read(){
read_p=0;read_ca=getchar();
while(read_ca<‘0‘||read_ca>‘9‘) read_ca=getchar();
while(read_ca>=‘0‘&&read_ca<=‘9‘) read_p=read_p*10+read_ca-48,read_ca=getchar();
return read_p;
}
struct na{
int x,y,z,ne;
}b[200001],bb[6000001];
struct tree{
int l,r,k;
}t[10000001];
int n,m,ma,la[MN],num=0,fa[MN],s[MN],size,root,va[MN],nm=0,ro[MN],lo[MN],op[MN],rot[MN],uu,nnmm=0,lla[MN],nnum=0;
bool v[MN];
const int INF=1e9;
inline void in(int x,int y){b[++num].y=y;b[num].ne=la[x];la[x]=num;}
inline void in(int u,int x,int y,int z){bb[++nnum].x=x;bb[nnum].y=y;bb[nnum].z=z;bb[nnum].ne=lla[u];lla[u]=nnum;}
inline void in(int &p,int l,int r,int x,int k){if (!p) p=++nm;t[p].k+=k;if (l==r) return;int mid=l+r>>1;if (x<=mid) in(t[p].l,l,mid,x,k);else in(t[p].r,mid+1,r,x,k);}
inline int que(int p,int l,int r,int x){if (!p||x<l) return 0;if (x==r) return t[p].k;int mid=l+r>>1;if (x<=mid) return que(t[p].l,l,mid,x);else return que(t[p].l,l,mid,mid)+que(t[p].r,mid+1,r,x);}
inline void gs(int x,int f){
int u=0;s[x]=1;
for (int i=la[x];i;i=b[i].ne)
if (!v[b[i].y]&&b[i].y!=f) gs(b[i].y,x),s[x]+=s[b[i].y],u=u>s[b[i].y]?u:s[b[i].y];
if (u<size-s[x]) u=size-s[x];
if (u<ma) root=x,ma=u;
}
inline void dfs(int x,int f,int dis){
if (dis==1) uu=++nnmm;
if (f) in(ro[root],1,n,dis,va[x]),in(rot[uu],1,n,dis,va[x]),in(x,root,uu,dis);
for (int i=la[x];i;i=b[i].ne)
if (b[i].y!=f&&(!v[b[i].y])) dfs(b[i].y,x,dis+1);
}
inline void work(int x,int siz,int f){
size=siz;ma=INF;gs(x,0);dfs(root,0,0);x=root;v[root]=1;
for (int i=la[x];i;i=b[i].ne)
if (!v[b[i].y]) work(b[i].y,s[b[i].y],x);
}
inline int qu(int x,int k){
int ans=que(ro[x],1,n,k)+va[x];
for (register int j=lla[x];j;j=bb[j].ne){if (k>=bb[j].z) ans+=va[bb[j].x];ans+=que(ro[bb[j].x],1,n,k-bb[j].z)-que(rot[bb[j].y],1,n,k-bb[j].z);}
return ans;
}
int main(){
int x,y,z;register int j;
n=read();m=read();
for (int i=1;i<=n;i++) va[i]=read();
for (int i=1;i<n;i++) x=read(),y=read(),in(x,y),in(y,x);
work(1,n,0);
int la=0;
while(m--){
x=read();y=read();z=read();y^=la;z^=la;
if (x){
z-=va[y];
for (register int j=lla[y];j;j=bb[j].ne)
in(ro[bb[j].x],1,n,bb[j].z,z),in(rot[bb[j].y],1,n,bb[j].z,z);
va[y]+=z;
}
else printf("%d\n",la=qu(y,z));
}
}