#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define fi first
#define se second
#define pii pair<int, int>
#define all(x) (x).begin(), (x).end()
using namespace std;
const int N = 1e5 + 5;
int h[N], sz[N], par[N], chainId[N], head[N], curChain = 1, pos[N], curPos = 0, n, q, a[N];
vector<int> ad[N];
void dfs(int u, int p)
{
sz[u] = 1;
for (int v : ad[u])
{
if (v == p) continue;
h[v] = h[u] + 1;
par[v] = u;
dfs(v, u);
sz[u] += sz[v];
}
}
void hld(int u, int p)
{
if (!head[curChain]) head[curChain] = u;
chainId[u] = curChain;
pos[u] = ++curPos;
int nxt = -1;
for (int v : ad[u])
{
if (v == p) continue;
if (nxt == -1 || sz[v] > sz[nxt]) nxt = v;
}
if (nxt != -1) hld(nxt, u);
for (int v : ad[u])
{
if (v == p || v == nxt) continue;
curChain++;
hld(v, u);
}
}
int lca(int u, int v)
{
while (chainId[u] != chainId[v])
{
if (chainId[u] > chainId[v]) u = par[head[chainId[u]]];
else v = par[head[chainId[v]]];
}
if (h[u] < h[v]) return u;
return v;
}
const ll INF = 1e18;
struct Node
{
ll sum, pre, suf, mx;
} st[4*N];
ll lz[4*N];
Node merge(const Node &l, const Node &r)
{
Node res;
res.sum = l.sum + r.sum;
res.pre = max(l.pre, l.sum+r.pre);
res.suf = max(r.suf, r.sum+l.suf);
res.mx = max({l.mx, r.mx, l.suf+r.pre});
return res;
}
void build(int id, int l, int r)
{
st[id] = {0, 0, 0, 0};
lz[id] = INF;
if (l == r) return;
int mid = (l+r)/2;
build(2*id, l, mid);
build(2*id+1, mid+1, r);
}
void apply(int id, int l, int r, ll x)
{
lz[id] = x;
if (x < 0) st[id] = {x*(r-l+1), 0, 0, 0};
else st[id] = {x*(r-l+1), x*(r-l+1), x*(r-l+1), x*(r-l+1)};
}
void push(int id, int l, int mid, int r)
{
if (lz[id] == INF) return;
apply(2*id, l, mid, lz[id]);
apply(2*id+1, mid+1, r, lz[id]);
lz[id] = INF;
}
void upd(int id, int l, int r, int u, int v, ll x)
{
if (v < l || r < u) return;
if (u <= l && r <= v)
{
apply(id, l, r, x);
return;
}
int mid = (l+r)/2;
push(id, l, mid, r);
upd(2*id, l, mid, u, v, x);
upd(2*id+1, mid+1, r, u, v, x);
st[id] = merge(st[2*id], st[2*id+1]);
}
Node get(int id, int l, int r, int u, int v)
{
if (v < l || r < u || u > v) return {0, 0, 0, 0};
if (u <= l && r <= v) return st[id];
int mid = (l+r)/2;
push(id, l, mid, r);
return merge(get(2*id, l, mid, u, v), get(2*id+1, mid+1, r, u, v));
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
#define task ""
if (fopen(task".inp", "r"))
{
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i < n; i++)
{
int u, v; cin >> u >> v;
ad[u].push_back(v);
ad[v].push_back(u);
}
dfs(1, 0);
hld(1, 0);
for (int i = 1; i <= n; i++) upd(1, 1, n, pos[i], pos[i], a[i]);
cin >> q;
while (q--)
{
int t; cin >> t;
if (t == 1)
{
int u, v; cin >> u >> v;
int w = lca(u, v);
Node l = {0, 0, 0, 0};
while (chainId[u] != chainId[w])
{
l = merge(get(1, 1, n, pos[head[chainId[u]]], pos[u]), l);
u = par[head[chainId[u]]];
}
l = merge(get(1, 1, n, pos[w], pos[u]), l);
Node r = {0, 0, 0, 0};
while (chainId[v] != chainId[w])
{
r = merge(get(1, 1, n, pos[head[chainId[v]]], pos[v]), r);
v = par[head[chainId[v]]];
}
r = merge(get(1, 1, n, pos[w]+1, pos[v]), r);
swap(l.pre, l.suf);
l = merge(l, r);
cout << l.mx << '\n';
}
else
{
int u, v; ll c; cin >> u >> v >> c;
int w = lca(u, v);
while (chainId[u] != chainId[w])
{
upd(1, 1, n, pos[head[chainId[u]]], pos[u], c);
u = par[head[chainId[u]]];
}
upd(1, 1, n, pos[w], pos[u], c);
while (chainId[v] != chainId[w])
{
upd(1, 1, n, pos[head[chainId[v]]], pos[v], c);
v = par[head[chainId[v]]];
}
upd(1, 1, n, pos[w]+1, pos[v], c);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwgKHgpLmVuZCgpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDFlNSArIDU7CmludCBoW05dLCBzeltOXSwgcGFyW05dLCBjaGFpbklkW05dLCBoZWFkW05dLCBjdXJDaGFpbiA9IDEsIHBvc1tOXSwgY3VyUG9zID0gMCwgbiwgcSwgYVtOXTsKdmVjdG9yPGludD4gYWRbTl07Cgp2b2lkIGRmcyhpbnQgdSwgaW50IHApCnsKICAgIHN6W3VdID0gMTsKICAgIGZvciAoaW50IHYgOiBhZFt1XSkKICAgIHsKICAgICAgICBpZiAodiA9PSBwKSBjb250aW51ZTsKICAgICAgICBoW3ZdID0gaFt1XSArIDE7CiAgICAgICAgcGFyW3ZdID0gdTsKICAgICAgICBkZnModiwgdSk7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICB9Cn0KCnZvaWQgaGxkKGludCB1LCBpbnQgcCkKewogICAgaWYgKCFoZWFkW2N1ckNoYWluXSkgaGVhZFtjdXJDaGFpbl0gPSB1OwogICAgY2hhaW5JZFt1XSA9IGN1ckNoYWluOwogICAgcG9zW3VdID0gKytjdXJQb3M7CiAgICBpbnQgbnh0ID0gLTE7CiAgICBmb3IgKGludCB2IDogYWRbdV0pCiAgICB7CiAgICAgICAgaWYgKHYgPT0gcCkgY29udGludWU7CiAgICAgICAgaWYgKG54dCA9PSAtMSB8fCBzelt2XSA+IHN6W254dF0pIG54dCA9IHY7CiAgICB9CiAgICBpZiAobnh0ICE9IC0xKSBobGQobnh0LCB1KTsKICAgIGZvciAoaW50IHYgOiBhZFt1XSkKICAgIHsKICAgICAgICBpZiAodiA9PSBwIHx8IHYgPT0gbnh0KSBjb250aW51ZTsKICAgICAgICBjdXJDaGFpbisrOwogICAgICAgIGhsZCh2LCB1KTsKICAgIH0KfQoKaW50IGxjYShpbnQgdSwgaW50IHYpCnsKICAgIHdoaWxlIChjaGFpbklkW3VdICE9IGNoYWluSWRbdl0pCiAgICB7CiAgICAgICAgaWYgKGNoYWluSWRbdV0gPiBjaGFpbklkW3ZdKSB1ID0gcGFyW2hlYWRbY2hhaW5JZFt1XV1dOwogICAgICAgIGVsc2UgdiA9IHBhcltoZWFkW2NoYWluSWRbdl1dXTsKICAgIH0KICAgIGlmIChoW3VdIDwgaFt2XSkgcmV0dXJuIHU7CiAgICByZXR1cm4gdjsKfQoKY29uc3QgbGwgSU5GID0gMWUxODsKc3RydWN0IE5vZGUKewogICAgbGwgc3VtLCBwcmUsIHN1ZiwgbXg7Cn0gc3RbNCpOXTsKbGwgbHpbNCpOXTsKCk5vZGUgbWVyZ2UoY29uc3QgTm9kZSAmbCwgY29uc3QgTm9kZSAmcikKewogICAgTm9kZSByZXM7CiAgICByZXMuc3VtID0gbC5zdW0gKyByLnN1bTsKICAgIHJlcy5wcmUgPSBtYXgobC5wcmUsIGwuc3VtK3IucHJlKTsKICAgIHJlcy5zdWYgPSBtYXgoci5zdWYsIHIuc3VtK2wuc3VmKTsKICAgIHJlcy5teCA9IG1heCh7bC5teCwgci5teCwgbC5zdWYrci5wcmV9KTsKICAgIHJldHVybiByZXM7Cn0KCnZvaWQgYnVpbGQoaW50IGlkLCBpbnQgbCwgaW50IHIpCnsKICAgIHN0W2lkXSA9IHswLCAwLCAwLCAwfTsKICAgIGx6W2lkXSA9IElORjsKICAgIGlmIChsID09IHIpIHJldHVybjsKICAgIGludCBtaWQgPSAobCtyKS8yOwogICAgYnVpbGQoMippZCwgbCwgbWlkKTsKICAgIGJ1aWxkKDIqaWQrMSwgbWlkKzEsIHIpOwp9Cgp2b2lkIGFwcGx5KGludCBpZCwgaW50IGwsIGludCByLCBsbCB4KQp7CiAgICBseltpZF0gPSB4OwogICAgaWYgKHggPCAwKSBzdFtpZF0gPSB7eCooci1sKzEpLCAwLCAwLCAwfTsKICAgIGVsc2Ugc3RbaWRdID0ge3gqKHItbCsxKSwgeCooci1sKzEpLCB4KihyLWwrMSksIHgqKHItbCsxKX07Cn0KCnZvaWQgcHVzaChpbnQgaWQsIGludCBsLCBpbnQgbWlkLCBpbnQgcikKewogICAgaWYgKGx6W2lkXSA9PSBJTkYpIHJldHVybjsKICAgIGFwcGx5KDIqaWQsIGwsIG1pZCwgbHpbaWRdKTsKICAgIGFwcGx5KDIqaWQrMSwgbWlkKzEsIHIsIGx6W2lkXSk7CiAgICBseltpZF0gPSBJTkY7Cn0KCnZvaWQgdXBkKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGxsIHgpCnsKICAgIGlmICh2IDwgbCB8fCByIDwgdSkgcmV0dXJuOwogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpCiAgICB7CiAgICAgICAgYXBwbHkoaWQsIGwsIHIsIHgpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQgPSAobCtyKS8yOwogICAgcHVzaChpZCwgbCwgbWlkLCByKTsKICAgIHVwZCgyKmlkLCBsLCBtaWQsIHUsIHYsIHgpOwogICAgdXBkKDIqaWQrMSwgbWlkKzEsIHIsIHUsIHYsIHgpOwogICAgc3RbaWRdID0gbWVyZ2Uoc3RbMippZF0sIHN0WzIqaWQrMV0pOwp9CgpOb2RlIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KQp7CiAgICBpZiAodiA8IGwgfHwgciA8IHUgfHwgdSA+IHYpIHJldHVybiB7MCwgMCwgMCwgMH07CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIHN0W2lkXTsKICAgIGludCBtaWQgPSAobCtyKS8yOwogICAgcHVzaChpZCwgbCwgbWlkLCByKTsKICAgIHJldHVybiBtZXJnZShnZXQoMippZCwgbCwgbWlkLCB1LCB2KSwgZ2V0KDIqaWQrMSwgbWlkKzEsIHIsIHUsIHYpKTsKfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICAjZGVmaW5lIHRhc2sgIiIKICAgIGlmIChmb3Blbih0YXNrIi5pbnAiLCAiciIpKQogICAgewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgaW50IHUsIHY7IGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KICAgIGRmcygxLCAwKTsKICAgIGhsZCgxLCAwKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgdXBkKDEsIDEsIG4sIHBvc1tpXSwgcG9zW2ldLCBhW2ldKTsKICAgIGNpbiA+PiBxOwogICAgd2hpbGUgKHEtLSkKICAgIHsKICAgICAgICBpbnQgdDsgY2luID4+IHQ7CiAgICAgICAgaWYgKHQgPT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIGludCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgICAgICBpbnQgdyA9IGxjYSh1LCB2KTsKICAgICAgICAgICAgTm9kZSBsID0gezAsIDAsIDAsIDB9OwogICAgICAgICAgICB3aGlsZSAoY2hhaW5JZFt1XSAhPSBjaGFpbklkW3ddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsID0gbWVyZ2UoZ2V0KDEsIDEsIG4sIHBvc1toZWFkW2NoYWluSWRbdV1dXSwgcG9zW3VdKSwgbCk7CiAgICAgICAgICAgICAgICB1ID0gcGFyW2hlYWRbY2hhaW5JZFt1XV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGwgPSBtZXJnZShnZXQoMSwgMSwgbiwgcG9zW3ddLCBwb3NbdV0pLCBsKTsKICAgICAgICAgICAgTm9kZSByID0gezAsIDAsIDAsIDB9OwogICAgICAgICAgICB3aGlsZSAoY2hhaW5JZFt2XSAhPSBjaGFpbklkW3ddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByID0gbWVyZ2UoZ2V0KDEsIDEsIG4sIHBvc1toZWFkW2NoYWluSWRbdl1dXSwgcG9zW3ZdKSwgcik7CiAgICAgICAgICAgICAgICB2ID0gcGFyW2hlYWRbY2hhaW5JZFt2XV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHIgPSBtZXJnZShnZXQoMSwgMSwgbiwgcG9zW3ddKzEsIHBvc1t2XSksIHIpOwogICAgICAgICAgICBzd2FwKGwucHJlLCBsLnN1Zik7CiAgICAgICAgICAgIGwgPSBtZXJnZShsLCByKTsKICAgICAgICAgICAgY291dCA8PCBsLm14IDw8ICdcbic7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGludCB1LCB2OyBsbCBjOyBjaW4gPj4gdSA+PiB2ID4+IGM7CiAgICAgICAgICAgIGludCB3ID0gbGNhKHUsIHYpOwogICAgICAgICAgICB3aGlsZSAoY2hhaW5JZFt1XSAhPSBjaGFpbklkW3ddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1cGQoMSwgMSwgbiwgcG9zW2hlYWRbY2hhaW5JZFt1XV1dLCBwb3NbdV0sIGMpOwogICAgICAgICAgICAgICAgdSA9IHBhcltoZWFkW2NoYWluSWRbdV1dXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1cGQoMSwgMSwgbiwgcG9zW3ddLCBwb3NbdV0sIGMpOwogICAgICAgICAgICB3aGlsZSAoY2hhaW5JZFt2XSAhPSBjaGFpbklkW3ddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1cGQoMSwgMSwgbiwgcG9zW2hlYWRbY2hhaW5JZFt2XV1dLCBwb3Nbdl0sIGMpOwogICAgICAgICAgICAgICAgdiA9IHBhcltoZWFkW2NoYWluSWRbdl1dXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1cGQoMSwgMSwgbiwgcG9zW3ddKzEsIHBvc1t2XSwgYyk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9Cg==