#include<bits/stdc++.h>
using namespace std;
template<typename T>
void read(T&x){
x=0;char c=getchar();T f=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c&15);
x=x*f;
}
template<typename T,typename...Args>
void read(T&x,Args&...args){read(x);read(args...);}
const int N=1e5+5;
const int INF=2e9;
struct node{
int dep,siz,tp,dfn,fa,dfa,usz,mx,vl;
bool vis;
vector<int>e;
}a[N];
vector<int>c[2][N];
int n,cnt=0,rt,sum;
void dfs1(int x){
a[x].vis=0;a[x].siz=1;
for(auto y:a[x].e)if(y^a[x].fa){
a[y].fa=x;
a[y].dep=a[x].dep+1;
dfs1(y);
a[x].siz+=a[y].siz;
}
}
void dfs2(int x){
int mx=0,hs;
a[x].dfn=++cnt;
for(auto y:a[x].e)if(y^a[x].fa)mx=max(mx,a[y].siz);
for(auto y:a[x].e)if(y^a[x].fa)if(a[y].siz==mx){hs=y;break;}
if(mx){
a[hs].tp=a[x].tp;dfs2(hs);
for(auto y:a[x].e)if(y^a[x].fa)if(y^hs){
a[y].tp=y;
dfs2(y);
}
}
}
int lca(int x,int y){
while(a[x].tp^a[y].tp){
if(a[a[x].tp].dep<a[a[y].tp].dep)swap(x,y);
x=a[a[x].tp].fa;
}
return (a[x].dep<a[y].dep)?x:y;
}
int get_dist(int x,int y){return a[x].dep+a[y].dep-(a[lca(x,y)].dep<<1);}
void calc_root(int x){
a[x].usz=1;a[x].mx=0;
for(auto y:a[x].e)if(y^a[x].fa&&!a[y].vis){
calc_root(y);
a[x].usz+=a[y].usz;
a[x].mx=max(a[x].mx,a[y].usz);
}
a[x].mx=max(a[x].mx,sum-a[x].usz);
if(a[x].mx<a[rt].mx)rt=x;
}
void build(int x){
a[x].vis=1;a[x].usz=sum+1;
c[0][x].resize(a[x].usz+1);
c[1][x].resize(a[x].usz+1);
for(auto y:a[x].e)if(!a[y].vis){
sum=a[y].usz;rt=0;a[rt].mx=INF;
calc_root(y);
a[rt].dfa=x;
build(rt);
}
}
int lowbit(int x){return x&-x;}
void modify(int op,int to,int x,int k){
for(int i=x+1;i<=a[to].usz;i+=lowbit(i))c[op][to][i]+=k;
}
int query(int op,int to,int x){
x=min(x+1,a[to].usz);int res=0;
for(int i=x;i;i-=lowbit(i))res+=c[op][to][i];
return res;
}
void work(int to,int k){
int i;
for(i=to;i;i=a[i].dfa)modify(0,i,get_dist(to,i),k);
for(i=to;a[i].dfa;i=a[i].dfa)modify(1,i,get_dist(to,a[i].dfa),k);
}
int main(){
int op,x,y,q,i,ans=0,dis;
read(n,q);
for(i=1;i<=n;i++)read(a[i].vl);
for(i=1;i<n;i++){
read(x,y);
a[x].e.push_back(y);
a[y].e.push_back(x);
}
a[1].dep=0;a[1].fa=0;a[1].tp=1;
dfs1(1);dfs2(1);
sum=n;rt=0;a[rt].mx=INF;
calc_root(1);
build(rt);
for(i=1;i<=n;i++)work(i,a[i].vl);
while(q--){
read(op,x,y);
x^=ans;y^=ans;
if(op)work(x,y-a[x].vl),a[x].vl=y;
else{
ans=query(0,x,y);
for(i=x;a[i].dfa;i=a[i].dfa){
dis=get_dist(x,a[i].dfa);
if(y>=dis)ans+=query(0,a[i].dfa,y-dis)-query(1,i,y-dis);
}
printf("%d\n",ans);
}
}
return 0;
}