rt
#include<bits/stdc++.h>
#define int long long
#define ls(x) ((x)*2)
#define rs(x) ((x)*2+1)
#define Debug(...) fprintf(stderr, __VA_ARGS__)
#define For(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define Rof(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define rep(i, b) for(int i=1,i##end=b;i<=i##end;i++)
using namespace std;
const int N=1e6+5,base=999983,Mod=998244353;
//char buf[(1<<21)+5],*p1,*p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline void chmx(int &x,int y){(x<y)&&(x=y);}
inline void chmn(int &x,int y){(x>y)&&(x=y);}
inline void Add(int &x,int y){(x=x+y+Mod)%=Mod;}
inline int read(){
int f=0,x=0;
char ch=getchar();
while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return f?-x:x;
}
void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n%10+'0');
}
int n,m;
int a[N];
struct Seg{
int x,l,r,all;
}tr[N<<2];
int lz[N];
bool vis[N];
vector<int>q[N];
int fa[N];
int son[N],dep[N],siz[N],top[N];
int id[N];
void dfs1(int x,int faz){
fa[x]=faz;
dep[x]=dep[faz]+1;
siz[x]=1;
for(auto v:q[x]){
if(v==faz) continue;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[v]>siz[son[x]]){
son[x]=v;
}
}
}
int cnt=0;
int dfn[N];
void dfs2(int x,int tp){
id[x]=++cnt;dfn[cnt]=x;
top[x]=tp;
if(!son[x])return;
dfs2(son[x],tp);
for(auto v:q[x]){
if(v==fa[x]||v==son[x])
continue;
dfs2(v,v);
}
}
inline Seg merge(Seg L,Seg R){
Seg res;
res.x=max({L.x,R.x,L.r+R.l});
res.all=L.all+R.all;
res.l=max(L.l,L.all+R.l);
res.r=max(R.r,R.all+L.r);
return res;
}
inline void down(int x,int l,int r,int k){
tr[x]={max(k,k*(r-l+1)),max(k,k*(r-l+1)),max(k,k*(r-l+1)),k*(r-l+1)};
lz[x]=k;
}
inline void pushdown(int x,int l,int r){
if(lz[x]!=INT_MIN){
int mid=(l+r)>>1;
down(ls(x),l,mid,lz[x]);
down(rs(x),mid+1,r,lz[x]);
lz[x]=INT_MIN;
}
}
void build(int x,int l,int r){
lz[x]=INT_MIN;
if(l==r) {
tr[x]={a[id[l]],a[id[l]],a[id[l]],a[id[l]]};
return;
}
int mid=(l+r)>>1;
build(ls(x),l,mid);build(rs(x),mid+1,r);
tr[x]=merge(tr[ls(x)],tr[rs(x)]);
}
void updata(int x,int l,int r,int L,int R,int k){
if(L>R) swap(L,R);
if(L<=l&&r<=R){down(x,l,r,k);return;}
int mid=(l+r)>>1;pushdown(x,l,r);
if(L<=mid) updata(ls(x),l,mid,L,R,k);
if(R>mid) updata(rs(x),mid+1,r,L,R,k);
tr[x]=merge(tr[ls(x)],tr[rs(x)]);
}
Seg query(int x,int l,int r,int L,int R){
if(L>R) swap(L,R);
if(L<=l&&r<=R) return tr[x];
int mid=(l+r)>>1;Seg res;pushdown(x,l,r);
if(L<=mid&&R>mid) res=merge(query(ls(x),l,mid,L,R),query(rs(x),mid+1,r,L,R));
else if(L<=mid) res=query(ls(x),l,mid,L,R);
else if(R>mid) res=query(rs(x),mid+1,r,L,R);
return res;
}
inline int LCA(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
return u;
}
inline Seg rev(Seg x){
swap(x.l,x.r);
return x;
}
pair<int,int>ans[N];
int tot;
inline int qry(int u,int v){
int lca=LCA(u,v);
Seg res={INT_MIN,INT_MIN,INT_MIN,0};
while(id[top[u]]>id[lca]){
if(res.x!=INT_MIN)res=merge(res,rev(query(1,1,n,id[top[u]],id[u])));
else res=rev(query(1,1,n,id[top[u]],id[u]));
u=fa[top[u]];
}
if(res.x!=INT_MIN)res=merge(res,rev(query(1,1,n,id[top[u]],id[u])));
else res=rev(query(1,1,n,id[lca],id[u]));
tot=0;
while(id[top[v]]>id[lca]){
ans[++tot]={id[top[v]],id[v]};
v=fa[top[v]];
}
if(v!=lca)ans[++tot]={id[lca]+1,id[v]};
Rof(i,tot,1){
if(res.x!=INT_MIN)res=merge(res,query(1,1,n,ans[i].first,ans[i].second));
else res=query(1,1,n,ans[i].first,ans[i].second);
}
return res.x;
}
inline void upd(int u,int v,int k){
int lca=LCA(u,v);
while(id[top[u]]>id[lca]){
updata(1,1,n,id[top[u]],id[u],k);
u=fa[top[u]];
}
updata(1,1,n,id[lca],id[u],k);
while(id[top[v]]>id[lca]){
updata(1,1,n,id[top[v]],id[v],k);
v=fa[top[v]];
}
if(v!=lca)updata(1,1,n,id[lca],id[v],k);
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
n=read();
For(i,1,n)a[i]=read();
For(i,1,n-1){
int u=read(),v=read();
q[u].push_back(v);
q[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
int Q=read();
while(Q--){
int op=read();
if(op==1){
int u=read(),v=read();
printf("%lld\n",max(0ll,qry(u,v)));
}
else{
int u=read(),v=read(),k=read();
upd(u,v,k);
}
}
#ifdef LOCAL
Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
return 0;
}