#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
#define ll unsigned long long
using namespace std;
inline char gc(){
static char now[1<<16],*S,*T;
if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}
const int N=1e5+10;
struct node{
int y,next;
}data[N<<1];
ll s[N],sum[N],size[N];
int h[N],n,m,nn,in[N],out[N],st[375],f[N][375],num,a[N],bl[N],rt,nm;
inline void add(int x,ll v){
while(x<=n) s[x]+=v,x+=x&-x;
}
inline ll query(int x){
static ll tmp;tmp=0;
while(x) tmp+=s[x],x-=x&-x;return tmp;
}
inline void dfs(int x,int fa){
++st[bl[x]];in[x]=++num;add(in[x],a[x]);size[x]=a[x];
for (int i=1;i<=nm;++i) f[x][i]=st[i];
for (int i=h[x];i;i=data[i].next){
int y=data[i].y;if (y==fa) continue;
dfs(y,x);size[x]+=size[y];
}out[x]=num;--st[bl[x]];sum[bl[x]]+=size[x];
}
int main(){
freopen("bzoj4765.in","r",stdin);
n=read();m=read();nn=sqrt(n);nm=(n-1)/nn+1;
for (int i=1;i<=n;++i) a[i]=read();
for (int i=1;i<=n;++i) bl[i]=(i-1)/nn+1;
for (int i=1;i<=n;++i){
int x=read(),y=read();
if (!x) {rt=y;continue;}
data[++num].y=y;data[num].next=h[x];h[x]=num;
data[++num].y=x;data[num].next=h[y];h[y]=num;
}num=0;dfs(rt,0);
for (int owo=1;owo<=m;++owo){
int op=read(),x=read(),y=read();
if (op==1){
for (int i=1;i<=nm;++i) sum[i]+=(ll)f[x][i]*(y-a[x]);
add(in[x],y-a[x]);a[x]=y;
}else{
ll ans=0;
if (bl[x]==bl[y]){
for (int i=x;i<=y;++i) ans+=query(out[i])-query(in[i]-1);
printf("%llu\n",ans);
}else{
for (int i=bl[x]+1;i<bl[y];++i) ans+=sum[i];
for (int i=x;bl[i]==bl[x];++i) ans+=query(out[i])-query(in[i]-1);
for (int i=y;bl[i]==bl[y];--i) ans+=query(out[i])-query(in[i]-1);
printf("%llu\n",ans);
}
}
}
return 0;
}