#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<ctime>
#include<queue>
#include<map>
#define ull unsigned long long
using namespace std;
int n,m,a,c,cnt;
int head[100005],top[100005],fa[100005],dep[100005],siz[100005],son[100005],id[100005],di[100005];
long long w[100005],b;
struct node{
int to,net;
}bian[200005];
struct str{
int l,r;
long long ans,lazy;
}s[400005];
void add(int u,int v){
cnt++;
bian[cnt].to=v;
bian[cnt].net=head[u];
head[u]=cnt;
return;
}
void Dfs(int u){
dep[u]=dep[fa[u]]+1;
siz[u]=1;
for(int i=head[u];i;i=bian[i].net){
int v=bian[i].to;
if(v==fa[u]) continue;
fa[v]=u;
Dfs(v);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
return;
}
void dfs(int u,int f){
cnt++;
id[u]=cnt;
di[cnt]=u;
top[u]=f;
if(!son[u]) return;
dfs(son[u],f);
for(int i=head[u];i;i=bian[i].net){
int v=bian[i].to;
if(v==son[u]||v==fa[u]) continue;
dfs(v,v);
}
return;
}
void build(int l,int r,int now){
s[now].l=l;s[now].r=r;s[now].lazy=0;
if(l==r){
s[now].ans=w[di[l]];
return;
}
int mid=(l+r)>>1;
build(l,mid,now<<1);
build(mid+1,r,now<<1|1);
s[now].ans=s[now<<1].ans+s[now<<1|1].ans;
return;
}
void lazy(int now){
if(s[now].lazy==0) return;
int z=now<<1,y=now<<1|1;
s[z].lazy+=s[now].lazy;
s[z].ans+=s[now].lazy*(s[z].r-s[z].l+1);
s[y].lazy+=s[now].lazy;
s[y].ans+=s[now].lazy*(s[y].r-s[y].l+1);
s[now].lazy=0;
return;
}
void update(int x,int y,int z,int now){
if(x<=s[now].l&&s[now].r<=y){
s[now].lazy+=z;
s[now].ans+=(s[now].r-s[now].l+1)*z;
return;
}
lazy(now);
int mid=(s[now].l+s[now].r)>>1;
if(x<=mid) update(x,y,z,now<<1);
if(y>mid) update(x,y,z,now<<1|1);
s[now].ans=s[now<<1].ans+s[now<<1|1].ans;
}
long long find(int x,int y,int now){
if(x<=s[now].l&&s[now].r<=y) return s[now].ans;
lazy(now);
int mid=(s[now].l+s[now].r)>>1;
long long sum=0;
if(x<=mid) sum+=find(x,y,now<<1);
if(y>mid) sum+=find(x,y,now<<1|1);
return sum;
}
long long find1(int x,int y){
long long sum=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
sum+=find(id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
sum+=find(id[x],id[y],1);
return sum;
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<n;i++){
cin>>a>>b;
add(a,b);
add(b,a);
}
Dfs(1);
cnt=0;
dfs(1,1);
build(1,n,1);
while(m--){
cin>>c;
if(c==1){
cin>>a>>b;
update(id[a],id[a],b,1);
}
if(c==2){
cin>>a>>b;
update(id[a],id[a]+siz[a]-1,b,1);
}
if(c==3){
cin>>a;
cout<<find1(a,1)<<endl;
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
/*
*/
WA2,7,8,9,10五个点