#include<iostream>
using namespace std;
const int N(1e5+5);
int n,q;
int fa[N],ch[N][2],val[N],sum[N],stk[N],pre[N],lst[N],cha[N],ans[N],siz[N];
bool tag[N];
inline bool isroot(int x){
return (ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x);
}
inline void pushup(int x){
siz[x]=siz[ch[x][0]]+1+siz[ch[x][1]];
sum[x]=sum[ch[x][0]]+val[x]+sum[ch[x][1]];
pre[x]=max(pre[ch[x][0]],sum[ch[x][0]]+val[x]+pre[ch[x][1]]);
lst[x]=max(lst[ch[x][1]],sum[ch[x][1]]+val[x]+lst[ch[x][0]]);
ans[x]=max(lst[ch[x][0]]+val[x]+pre[ch[x][1]],max(ans[ch[x][0]],ans[ch[x][1]]));
}
inline void reverse(int x){
swap(ch[x][0],ch[x][1]);swap(pre[x],lst[x]);tag[x]^=1;
}
inline void add(int x,int k){
val[x]=cha[x]=k;
sum[x]=siz[x]*k;
if(k>0) pre[x]=lst[x]=ans[x]=sum[x];
else pre[x]=lst[x]=ans[x]=0;
}
inline void pushdown(int x){
if(-1e4<=cha[x]&&cha[x]<=1e4){
if(ch[x][0]) add(ch[x][0],cha[x]);
if(ch[x][1]) add(ch[x][1],cha[x]);
cha[x]=0x7fffffff;
}
if(tag[x]){
if(ch[x][0]) reverse(ch[x][0]);
if(ch[x][1]) reverse(ch[x][1]);
tag[x]=0;
}
}
inline void rotate(int x){
int y=fa[x],z=fa[y],k=(ch[y][1]==x);
if(!isroot(y)) ch[z][ch[z][1]==y]=x;
fa[x]=z;
ch[y][k]=ch[x][k^1];
if(ch[x][k^1]) fa[ch[x][k^1]];
ch[x][k^1]=y;
fa[y]=x;
pushup(y);pushup(x);
}
inline void splay(int x){
int y=x,z=0;
stk[++z]=y;
while(!isroot(y)) stk[++z]=y=fa[y];
while(z) pushdown(stk[z--]);
while(!isroot(x)){
y=fa[x];z=fa[y];
if(!isroot(y))
rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
rotate(x);
}
}
inline void access(int x){
for(int y=0;x;x=fa[y=x])
splay(x),ch[x][1]=y,pushup(x);
}
inline void makeroot(int x){
access(x);splay(x);reverse(x);
}
inline void split(int x,int y){
makeroot(x);
access(y);splay(y);
}
inline void link(int x,int y){
makeroot(x);fa[x]=y;
}
int main(){
#ifdef ytxy
freopen("in.txt","r",stdin);
#endif
ios::sync_with_stdio(0);
cin.tie(),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>val[i];
siz[i]=1;
sum[i]=val[i];
pre[i]=lst[i]=ans[i]=max(0,val[i]);
cha[i]=0x7fffffff;
}
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
link(u,v);
}
cin>>q;
while(q--){
int op,a,b,k;
cin>>op>>a>>b;
if(op==1){
split(a,b);
cout<<ans[b]<<'\n';
}
else if(op==2){
cin>>k;
split(a,b);
add(b,k);
}
}
}
qwq