#include<bits/stdc++.h>
#define R register
using namespace std;
typedef long long ll;
inline ll read(){
ll s=0,f=0,c=getchar();
for(;!isdigit(c);c=getchar())f|=c==45;
for(;isdigit(c);c=getchar())s=(s<<3)+(s<<1)+(c^48);
return f?-s:s;
}
inline void put1(ll x){
if(x<0)putchar(45),x=-x;
if(x>9)put1(x/10);
putchar(x%10+48);
}
inline void put(ll x,char c=' '){
put1(x);
putchar(c);
}
inline ll qpow(ll a,ll b,ll mod){
ll res=1;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;b>>=1;
}
return res;
}
inline void swp(ll&a,ll&b){
a^=b^=a^=b;
}
const ll N=120000;
ll t[N<<2],lz[N<<2],cnt,H[N];
ll top[N],dep[N],son[N],sz[N],val[N],fa[N];
ll dfn[N<<2],dfp[N<<2];
struct E{
ll nx,to;
}e[N<<1];
struct P{
ll x,y,w;
}po[N<<1];
inline void add(ll x,ll y){
e[++cnt].to=y;e[cnt].nx=H[x];H[x]=cnt;
}
void dfs1(ll x,ll f){
sz[x]=1;fa[x]=f;dep[x]=dep[f]+1;
for(ll i=H[x];i;i=e[i].nx){
ll y=e[i].to;
if(y-f){
dfs1(y,x);sz[x]+=sz[y];
if(sz[y]>sz[son[x]])son[x]=y;
}
}
}
void dfs2(ll x,ll f){
dfn[x]=++dfn[0];
dfp[dfn[0]]=x;
if(son[x]){
top[son[x]]=top[x];
dfs2(son[x],x);
}
for(ll i=H[x];i;i=e[i].nx){
ll y=e[i].to;
if(y-fa[x]&&y-son[x]){
top[y]=y;
dfs2(y,x);
}
}
}
void pushup(ll rt){
t[rt]=t[rt<<1]+t[rt<<1|1];
}
void pushdown(ll rt,ll x){
if(!lz[rt])return;
t[rt<<1]+=lz[rt]*(x-(x>>1));
lz[rt<<1]+=lz[rt];
t[rt<<1|1]+=lz[rt]*(x>>1);
lz[rt<<1|1]+=lz[rt];
lz[rt]=0;
}
void build(ll rt,ll l,ll r){
lz[rt]=0;
if(l==r){
t[rt]=val[dfp[l]];
return;
}
ll mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void modify(ll rt,ll l,ll r,ll x,ll y,ll v){
if(x<=l&&y>=r){
lz[rt]+=v;
t[rt]+=v*(r-l+1);
return;
}
pushdown(rt,r-l+1);
ll mid=l+r>>1;
if(mid>=x)modify(rt<<1,l,mid,x,y,v);
if(mid<y)modify(rt<<1|1,mid+1,r,x,y,v);
pushup(rt);
}
ll query(ll rt,ll l,ll r,ll x,ll y){
ll ans=0,mid=l+r>>1;
if(x<=l&&y>=r)return t[rt];
pushdown(rt,r-l+1);
if(mid>=x)ans=query(rt<<1,l,mid,x,y);
if(mid<y)ans+=query(rt<<1|1,mid+1,r,x,y);
return ans;
}
inline void update(ll x,ll y,ll v){
ll tx=top[x],ty=top[y];
while(tx-ty){
if(dep[tx]<dep[ty])swap(x,y),swap(tx,ty);
modify(1,1,dfn[0],dfn[tx],dfn[x],v);
x=fa[tx];tx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
modify(1,1,dfn[0],dfn[x],dfn[y],v);
}
inline ll Query(ll x,ll y){
ll tx=top[x],ty=top[y],res=0;
while(tx-ty){
if(dep[tx]<dep[ty])swap(x,y),swap(tx,ty);
res+=query(1,1,dfn[0],dfn[tx],dfn[x]);
x=fa[tx];tx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
if(x==y)return res;
res+=query(1,1,dfn[0],dfn[x],dfn[y]);
return res;
}
int main(){
ll n=read(),m=read();
for(ll i=1;i<=n;i++)val[i]=read();
for(ll i=1,x,y;i<n;i++)
x=read(),y=read(),add(x,y),add(y,x);
dfs1(1,0);dfn[0]=0;top[1]=1;top[0]=1;
dfs2(1,0);build(1,1,dfn[0]);
while(m--){
ll op=read();
if(op==1){
ll x=read(),a=read();
update(x,x,a);
}
if(op==2){
ll x=read(),a=read();
modify(1,1,dfn[0],dfn[x],dfn[x]+sz[x]-1,a);
}
if(op==3){
ll x=read();
put(Query(1,x),10);
}
}
}