/// Link:
#include <bits/stdc++.h>
using namespace std;
bool M1;
//#define int long long
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define il pair<ll,ll>
#define ii pair<int,int>
#define len(s) (int)s.size()
#define all(s) (s).begin(),(s).end()
#define OpenFile(Name) if (fopen(Name".inp","r")) freopen(Name".inp","r",stdin),freopen(Name".out","w",stdout);
#define MASK(x) ((1LL)<<(x))
#define Bit(x,i) (((x)>>(i))&1)
#define Countbit(x) __builtin_popcountll(x)
typedef long long ll;
typedef long double ld;
int dx[]={1,-1,0,0,-1,1,1,-1};
int dy[]={0,0,1,-1,-1,-1,1,1};
template <class T> bool Minimize(T &a,T b) { if (a>b) { a=b; return true; } return false;}
template <class T> bool Maximize(T &a,T b) { if (a<b) { a=b; return true; } return false;}
inline ll add(ll a,ll b,ll c) { return (a+b)%c; };
inline ll sub(ll a,ll b,ll c) { return (a-b+c)%c; };
inline ll mul(ll a,ll b,ll c) { return ((a%c)*(b%c))%c; };
const int N=1e5+5,M=1e3+5,INF=1e9,lim=1e6;
const int block=448,base=256;
ll Mod=1e9+7,Mod_base=1777777777,LNF=1e18;
///________________________________________________________________________________________________________
int n,q;
vector<int> g[N];
int gt[N],timer=0;
int tin[N],tout[N],sz[N],heavy[N],head[N],h[N],par[N];
void DFS(int u=1,int p=0) {
sz[u]=1;
for (int v:g[u])
if (v!=p) {
h[v]=h[u]+1;
par[v]=u;
DFS(v,u);
sz[u]+=sz[v];
if (sz[v]>sz[heavy[u]]) heavy[u]=v;
}
}
void HLD(int u=1,int p=1) {
tin[u]=++timer;
head[u]=p;
if (heavy[u]) HLD(heavy[u],p);
for (int v:g[u])
if (v!=par[u] && v!=heavy[u]) HLD(v,v);
}
struct seg {
ll sum,pre,suf,best;
seg() {
sum=0;
pre=suf=best=0;
}
};
seg combine(seg a,seg b) {
seg res;
res.sum=a.sum+b.sum;
res.pre=max(a.pre,a.sum+b.pre);
res.suf=max(b.suf,b.sum+a.suf);
res.best=max(max(a.best,b.best),a.suf+b.pre);
return res;
}
ll lazy[4*N];
seg t[4*N];
void apply(int i,int l,int r,ll val) {
t[i].sum=(r-l+1)*val;
lazy[i]=val;
t[i].pre=t[i].suf=t[i].best=max(0LL,t[i].sum);
}
void Push(int i,int l,int r) {
if (lazy[i]==-1) return ;
int m=(l+r)>>1;
apply(i<<1,l,m,lazy[i]);
apply(i<<1|1,m+1,r,lazy[i]);
lazy[i]=-1;
}
void upd(int i,int l,int r,int u,int v,ll val) {
if (v<l || r<u) return ;
if (u<=l && r<=v) {
apply(i,l,r,val);
return ;
}
Push(i,l,r);
int m=(l+r)>>1;
upd(i<<1,l,m,u,v,val);
upd(i<<1|1,m+1,r,u,v,val);
t[i]=combine(t[i<<1],t[i<<1|1]);
}
seg get(int i,int l,int r,int u,int v) {
if (v<l || r<u) return seg();
if (u<=l && r<=v) return t[i];
Push(i,l,r);
int m=(l+r)>>1;
return combine(get(i<<1,l,m,u,v),get(i<<1|1,m+1,r,u,v));
}
void upd_path(int u,int v,ll val) {
while (head[u]!=head[v]) {
if (h[head[u]]<h[head[v]]) swap(u,v);
upd(1,1,n,tin[head[u]],tin[u],val);
u=par[head[u]];
}
if (h[u]>h[v]) swap(u,v);
upd(1,1,n,tin[u],tin[v],val);
}
ll get_path(int u,int v) {
seg l,r;
while (head[u]!=head[v]) {
if (h[head[u]]<h[head[v]]) {
r=combine(get(1,1,n,tin[head[v]],tin[v]),r);
v=par[head[v]];
} else {
l=combine(get(1,1,n,tin[head[u]],tin[u]),l);
u=par[head[u]];
}
}
if (h[u]>h[v]) l=combine(get(1,1,n,tin[v],tin[u]),l); else
r=combine(get(1,1,n,tin[u],tin[v]),r);
return max(max(l.best,r.best),l.pre+r.pre);
}
bool M2;
signed main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
OpenFile("TASK");
cin>>n;
for (int i=1;i<=n;++i) cin>>gt[i];
for (int i=1;i<n;++i) {
int u,v; cin>>u>>v;
g[u].eb(v);
g[v].eb(u);
}
DFS();
HLD();
memset(lazy,-1,sizeof lazy);
for (int i=1;i<=n;++i) upd(1,1,n,tin[i],tin[i],gt[i]);
int q; cin>>q;
while (q--) {
int op,a,b,c; cin>>op>>a>>b;
if (op==1) cout<<get_path(a,b)<<'\n'; else {
cin>>c;
upd_path(a,b,c);
}
}
cerr<<"Time: "<<(1.0*clock()/CLOCKS_PER_SEC)<<" s\n";
cerr<<"Memory: "<<abs(&M2-&M1)/1024.0/1024<<" MB\n";
return 0;
}
Ly8vIExpbms6CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKYm9vbCBNMTsKLy8jZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIGlsIHBhaXI8bGwsbGw+CiNkZWZpbmUgaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIGxlbihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLChzKS5lbmQoKQojZGVmaW5lIE9wZW5GaWxlKE5hbWUpIGlmIChmb3BlbihOYW1lIi5pbnAiLCJyIikpIGZyZW9wZW4oTmFtZSIuaW5wIiwiciIsc3RkaW4pLGZyZW9wZW4oTmFtZSIub3V0IiwidyIsc3Rkb3V0KTsKCiNkZWZpbmUgTUFTSyh4KSAoKDFMTCk8PCh4KSkKI2RlZmluZSBCaXQoeCxpKSAoKCh4KT4+KGkpKSYxKQojZGVmaW5lIENvdW50Yml0KHgpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKCmludCBkeFtdPXsxLC0xLDAsMCwtMSwxLDEsLTF9OwppbnQgZHlbXT17MCwwLDEsLTEsLTEsLTEsMSwxfTsKCnRlbXBsYXRlIDxjbGFzcyBUPiBib29sIE1pbmltaXplKFQgJmEsVCBiKSB7IGlmIChhPmIpIHsgYT1iOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fQp0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBNYXhpbWl6ZShUICZhLFQgYikgeyBpZiAoYTxiKSB7IGE9YjsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30KCmlubGluZSBsbCBhZGQobGwgYSxsbCBiLGxsIGMpIHsgcmV0dXJuIChhK2IpJWM7IH07CmlubGluZSBsbCBzdWIobGwgYSxsbCBiLGxsIGMpIHsgcmV0dXJuIChhLWIrYyklYzsgfTsKaW5saW5lIGxsIG11bChsbCBhLGxsIGIsbGwgYykgeyByZXR1cm4gKChhJWMpKihiJWMpKSVjOyB9OwoKY29uc3QgaW50IE49MWU1KzUsTT0xZTMrNSxJTkY9MWU5LGxpbT0xZTY7CmNvbnN0IGludCBibG9jaz00NDgsYmFzZT0yNTY7CgpsbCBNb2Q9MWU5KzcsTW9kX2Jhc2U9MTc3Nzc3Nzc3NyxMTkY9MWUxODsKCi8vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgppbnQgbixxOwp2ZWN0b3I8aW50PiBnW05dOwppbnQgZ3RbTl0sdGltZXI9MDsKaW50IHRpbltOXSx0b3V0W05dLHN6W05dLGhlYXZ5W05dLGhlYWRbTl0saFtOXSxwYXJbTl07Cgp2b2lkIERGUyhpbnQgdT0xLGludCBwPTApIHsKICAgIHN6W3VdPTE7CiAgICBmb3IgKGludCB2OmdbdV0pCiAgICBpZiAodiE9cCkgewogICAgICAgIGhbdl09aFt1XSsxOwogICAgICAgIHBhclt2XT11OwogICAgICAgIERGUyh2LHUpOwogICAgICAgIHN6W3VdKz1zelt2XTsKICAgICAgICBpZiAoc3pbdl0+c3pbaGVhdnlbdV1dKSBoZWF2eVt1XT12OwogICAgfQp9Cgp2b2lkIEhMRChpbnQgdT0xLGludCBwPTEpIHsKICAgIHRpblt1XT0rK3RpbWVyOwogICAgaGVhZFt1XT1wOwogICAgaWYgKGhlYXZ5W3VdKSBITEQoaGVhdnlbdV0scCk7CiAgICBmb3IgKGludCB2OmdbdV0pCiAgICBpZiAodiE9cGFyW3VdICYmIHYhPWhlYXZ5W3VdKSBITEQodix2KTsKfQoKc3RydWN0IHNlZyB7CiAgICBsbCBzdW0scHJlLHN1ZixiZXN0OwogICAgc2VnKCkgewogICAgICAgIHN1bT0wOwogICAgICAgIHByZT1zdWY9YmVzdD0wOwogICAgfQp9OwoKc2VnIGNvbWJpbmUoc2VnIGEsc2VnIGIpIHsKICAgIHNlZyByZXM7CiAgICByZXMuc3VtPWEuc3VtK2Iuc3VtOwogICAgcmVzLnByZT1tYXgoYS5wcmUsYS5zdW0rYi5wcmUpOwogICAgcmVzLnN1Zj1tYXgoYi5zdWYsYi5zdW0rYS5zdWYpOwogICAgcmVzLmJlc3Q9bWF4KG1heChhLmJlc3QsYi5iZXN0KSxhLnN1ZitiLnByZSk7CiAgICByZXR1cm4gcmVzOwp9CgpsbCBsYXp5WzQqTl07CnNlZyB0WzQqTl07Cgp2b2lkIGFwcGx5KGludCBpLGludCBsLGludCByLGxsIHZhbCkgewogICAgdFtpXS5zdW09KHItbCsxKSp2YWw7CiAgICBsYXp5W2ldPXZhbDsKICAgIHRbaV0ucHJlPXRbaV0uc3VmPXRbaV0uYmVzdD1tYXgoMExMLHRbaV0uc3VtKTsKfQoKdm9pZCBQdXNoKGludCBpLGludCBsLGludCByKSB7CiAgICBpZiAobGF6eVtpXT09LTEpIHJldHVybiA7CiAgICBpbnQgbT0obCtyKT4+MTsKICAgIGFwcGx5KGk8PDEsbCxtLGxhenlbaV0pOwogICAgYXBwbHkoaTw8MXwxLG0rMSxyLGxhenlbaV0pOwogICAgbGF6eVtpXT0tMTsKfQoKdm9pZCB1cGQoaW50IGksaW50IGwsaW50IHIsaW50IHUsaW50IHYsbGwgdmFsKSB7CiAgICBpZiAodjxsIHx8IHI8dSkgcmV0dXJuIDsKICAgIGlmICh1PD1sICYmIHI8PXYpIHsKICAgICAgICBhcHBseShpLGwscix2YWwpOwogICAgICAgIHJldHVybiA7CiAgICB9CiAgICBQdXNoKGksbCxyKTsKICAgIGludCBtPShsK3IpPj4xOwogICAgdXBkKGk8PDEsbCxtLHUsdix2YWwpOwogICAgdXBkKGk8PDF8MSxtKzEscix1LHYsdmFsKTsKICAgIHRbaV09Y29tYmluZSh0W2k8PDFdLHRbaTw8MXwxXSk7Cn0KCnNlZyBnZXQoaW50IGksaW50IGwsaW50IHIsaW50IHUsaW50IHYpIHsKICAgIGlmICh2PGwgfHwgcjx1KSByZXR1cm4gc2VnKCk7CiAgICBpZiAodTw9bCAmJiByPD12KSByZXR1cm4gdFtpXTsKICAgIFB1c2goaSxsLHIpOwogICAgaW50IG09KGwrcik+PjE7CiAgICByZXR1cm4gY29tYmluZShnZXQoaTw8MSxsLG0sdSx2KSxnZXQoaTw8MXwxLG0rMSxyLHUsdikpOwp9Cgp2b2lkIHVwZF9wYXRoKGludCB1LGludCB2LGxsIHZhbCkgewogICAgd2hpbGUgKGhlYWRbdV0hPWhlYWRbdl0pIHsKICAgICAgICBpZiAoaFtoZWFkW3VdXTxoW2hlYWRbdl1dKSBzd2FwKHUsdik7CiAgICAgICAgdXBkKDEsMSxuLHRpbltoZWFkW3VdXSx0aW5bdV0sdmFsKTsKICAgICAgICB1PXBhcltoZWFkW3VdXTsKICAgIH0KICAgIGlmIChoW3VdPmhbdl0pIHN3YXAodSx2KTsKICAgIHVwZCgxLDEsbix0aW5bdV0sdGluW3ZdLHZhbCk7Cn0KCmxsIGdldF9wYXRoKGludCB1LGludCB2KSB7CiAgICBzZWcgbCxyOwogICAgd2hpbGUgKGhlYWRbdV0hPWhlYWRbdl0pIHsKICAgICAgICBpZiAoaFtoZWFkW3VdXTxoW2hlYWRbdl1dKSB7CiAgICAgICAgICAgIHI9Y29tYmluZShnZXQoMSwxLG4sdGluW2hlYWRbdl1dLHRpblt2XSkscik7CiAgICAgICAgICAgIHY9cGFyW2hlYWRbdl1dOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGw9Y29tYmluZShnZXQoMSwxLG4sdGluW2hlYWRbdV1dLHRpblt1XSksbCk7CiAgICAgICAgICAgIHU9cGFyW2hlYWRbdV1dOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoW3VdPmhbdl0pIGw9Y29tYmluZShnZXQoMSwxLG4sdGluW3ZdLHRpblt1XSksbCk7IGVsc2UKICAgICAgICAgICAgICAgICAgIHI9Y29tYmluZShnZXQoMSwxLG4sdGluW3VdLHRpblt2XSkscik7CiAgICByZXR1cm4gbWF4KG1heChsLmJlc3Qsci5iZXN0KSxsLnByZStyLnByZSk7Cn0KCmJvb2wgTTI7CnNpZ25lZCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgT3BlbkZpbGUoIlRBU0siKTsKCiAgICBjaW4+Pm47CiAgICBmb3IgKGludCBpPTE7aTw9bjsrK2kpIGNpbj4+Z3RbaV07CiAgICBmb3IgKGludCBpPTE7aTxuOysraSkgewogICAgICAgIGludCB1LHY7IGNpbj4+dT4+djsKICAgICAgICBnW3VdLmViKHYpOwogICAgICAgIGdbdl0uZWIodSk7CiAgICB9CgogICAgREZTKCk7CiAgICBITEQoKTsKICAgIG1lbXNldChsYXp5LC0xLHNpemVvZiBsYXp5KTsKCiAgICBmb3IgKGludCBpPTE7aTw9bjsrK2kpIHVwZCgxLDEsbix0aW5baV0sdGluW2ldLGd0W2ldKTsKICAgIGludCBxOyBjaW4+PnE7CiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgaW50IG9wLGEsYixjOyBjaW4+Pm9wPj5hPj5iOwogICAgICAgIGlmIChvcD09MSkgY291dDw8Z2V0X3BhdGgoYSxiKTw8J1xuJzsgZWxzZSB7CiAgICAgICAgICAgIGNpbj4+YzsKICAgICAgICAgICAgdXBkX3BhdGgoYSxiLGMpOwogICAgICAgIH0KICAgIH0KCgogICAgY2Vycjw8IlRpbWU6ICI8PCgxLjAqY2xvY2soKS9DTE9DS1NfUEVSX1NFQyk8PCIgc1xuIjsKICAgIGNlcnI8PCJNZW1vcnk6ICI8PGFicygmTTItJk0xKS8xMDI0LjAvMTAyNDw8IiBNQlxuIjsKICAgIHJldHVybiAwOwp9Cg==