#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
inline int read()
{
int sign=1;
char ch;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') sign=-1;
int res=ch-48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-48;
return res*sign;
}
int n,m;
int reg[N*4],rev[N*4],father[N],dep[N],size[N],son[N],top[N];
int head[N],tot;
long long summ,sum[N],add[N*4],num[N];
struct edge
{
int to,nxt;
}edge[N*2];
void addedge(int x,int y)
{
edge[++tot].to=y;
edge[tot].nxt=head[x];
head[x]=tot;
}
void dfs1(int u,int f)
{
size[u]=1;
dep[u]=dep[f]+1;
father[u]=f;
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v!=f)
{
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
}
}
void dfs2(int u,int f)
{
if(son[u])
{
reg[son[u]]=++reg[0];
rev[reg[0]]=son[u];
top[son[u]]=top[u];
dfs2(son[u],u);
}
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(!top[v])
{
reg[v]=++reg[0];
rev[reg[0]]=v;
top[v]=v;
dfs2(v,u);
}
}
}
void build(int k,int l,int r)
{
int mid=(l+r)>>1;
if(l==r)
{
sum[k]=num[rev[l]];
return;
}
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void Add(int k,int l,int r,int v)
{
add[k]+=v;
sum[k]+=(long long )v*(r-l+1);
}
void pushdown(int k,int l,int r,int mid)
{
if(add[k]==0) return;
Add(k<<1,l,mid,add[k]);
Add(k<<1|1,mid+1,r,add[k]);
add[k]=0;
}
void modify1(int k,int l,int r,int x,int y,int v)
{
if(r<x||y<l) return;
if(l>=x&&r<=y)
{
Add(k,l,r,v);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid) modify1(k<<1,l,mid,x,y,v);
if(y>=mid+1) modify1(k<<1|1,mid+1,r,x,y,v);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void query(int k,int l,int r,int x,int y)
{
if(r<x||l>y) return;
if(l>=x&&r<=y)
{
summ+=sum[k];
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid) query(k<<1,l,mid,x,y);
if(y>=mid+1) query(k<<1|1,mid+1,r,x,y);
}
void ask(int x,int y)
{
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(dep[fx]<dep[fy]) swap(fx,fy),swap(x,y);
query(1,1,reg[0],reg[fx],reg[x]);
x=father[fx];
fx=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
query(1,1,reg[0],reg[x],reg[y]);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) num[i]=read();
for(int i=1;i<n;i++)
{
int x,y;
x=read(),y=read();
addedge(x,y);
addedge(y,x);
}
dfs1(1,0);
reg[0]=reg[1]=rev[1]=top[1]=1;
dfs2(1,0);
build(1,1,reg[0]);
int p,a,b;
for(int i=1;i<=n;i++)
modify1(1,1,reg[0],reg[i],reg[i]+size[i]-1,0);
for(int i=1;i<=m;i++)
{
p=read();
if(p==1)
{
a=read(),b=read();
modify1(1,1,reg[0],reg[a],reg[a],b);
}
else if(p==2)
{
a=read(),b=read();
modify1(1,1,reg[0],reg[a],reg[a]+size[a]-1,b);
}
else
{
summ=0;
a=read();
ask(1,a);
printf("%lld\n",summ);
}
}