#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define inf (int)1e18
#define debug cout << "IAKIOI" << endl
using namespace std;
vector<int>e[100010];
int fa[100010],siz[100010],dep[100010],son[100010];
int id[100010],bef[100010],top[100010],tot;
int a[100010];
void dfs1(int x,int f)
{
fa[x]=f;
dep[x]=dep[f]+1;
for ( int i = 0 ; i < e[x].size() ; i++ )
{
int v=e[x][i];
if(v==f)
{
continue;
}
dfs1(v,x);
siz[x]+=siz[v];
if(siz[son[x]]<siz[v])
{
son[x]=v;
}
}
siz[x]++;
}
void dfs2(int x,int head)
{
if(x==0)
{
return;
}
top[x]=head;
id[x]=++tot;
bef[tot]=x;
dfs2(son[x],head);
for ( int i = 0 ; i < e[x].size() ; i++ )
{
int v=e[x][i];
if(v==fa[x]||v==son[x])
{
continue;
}
dfs2(v,v);
}
}
struct abc{
int l,r,val,tag;
int siz()
{
return r-l+1;
}
}t[400010];
void pd(int x)
{
if(t[x].tag==0||t[x].l==t[x].r)
{
return;
}
t[x<<1].tag+=t[x].tag;
t[x<<1|1].tag+=t[x].tag;
t[x<<1].val+=t[x<<1].siz()*t[x].tag;
t[x<<1|1].val+=t[x<<1|1].siz()*t[x].tag;
t[x].tag=0;
}
void build(int x,int l,int r)
{
t[x].l=l;
t[x].r=r;
if(l==r)
{
t[x].val=a[bef[l]];
return;
}
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x].val=t[x<<1].val+t[x<<1|1].val;
}
void upd(int x,int l,int r,int v)
{
int lf=t[x].l;
int rt=t[x].r;
if(l<=lf&&rt<=r)
{
t[x].val+=t[x].siz()*v;
t[x].tag+=v;
return;
}
if(rt<l||r<lf)
{
return;
}
pd(x);
upd(x<<1,l,r,v);
upd(x<<1|1,l,r,v);
t[x].val=t[x<<1].val+t[x<<1|1].val;
}
int calc(int x,int l,int r)
{
int lf=t[x].l;
int rt=t[x].r;
if(l<=lf&&rt<=r)
{
return t[x].val;
}
if(rt<l||r<lf)
{
return 0;
}
pd(x);
return calc(x<<1,l,r)+calc(x<<1|1,l,r);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,q;
cin >> n >> q;
for ( int i = 1 ; i <= n ; i++ )
{
cin >> a[i];
}
for ( int i = 1 ; i < n ; i++ )
{
int u,v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,1);
dfs2(1,1);
build(1,1,n);
while(q--)
{
int op,x,a;
cin >> op >> x;
if(op==1)
{
cin >> a;
upd(1,id[x],id[x],a);
}else if(op==2)
{
cin >> a;
upd(1,id[x],id[x]+siz[x]-1,a);
}else{
int ans=0;
while(x!=1)
{
ans+=calc(1,id[top[x]],id[x]);
x=fa[top[x]];
}
cout << ans << endl;
}
}
return 0;
}