#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
struct node{
int opt,u,val;
}a[100003];
int n,m;
int v[100003];
set<int>s;
pii edg[100003];
int f[100003];
int cnt[100003];
stack<int>ans;
int find(int x){
if(x!=f[x])f[x]=find(f[x]);
return f[x];
}
int t(int a,int b){
int fa=find(a),fb=find(b);
cnt[fa]+=cnt[fb];
f[fb]=fa;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i];
f[i]=i;
}
for(int i=1;i<n;i++){
cin>>edg[i].first>>edg[i].second;
}
for(int i=1;i<=m;i++){
cin>>a[i].opt>>a[i].u;
if(a[i].opt==1)s.insert(a[i].u);
if(a[i].opt==2){
a[i].val=v[a[i].u];
cin>>v[a[i].u];
}
}
for(int i=1;i<=n;i++)cnt[i]=v[i];
for(int i=1;i<n;i++){
if(s.find(i)==s.end()){
t(edg[i].first,edg[i].second);
}
}
for(int i=m;i>0;i--){
if(a[i].opt==1){
t(edg[a[i].u].first,edg[a[i].u].second);
}
if(a[i].opt==2){
cnt[find(a[i].u)]+=a[i].val-v[a[i].u];
v[a[i].u]=a[i].val;
}
if(a[i].opt==3){
ans.push(cnt[find(a[i].u)]);
}
}
while(!ans.empty()){
cout<<ans.top()<<'\n';
ans.pop();
}
return 0;
}