/* AUTHOR: TUAN ANH - BUI */
// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) return x = y, true;
return false;
}
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) return x = y, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
/*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */
const int MOD = 1e9 + 7;
const int inf = (int)1e9 + 27092008;
const ll INF = (ll)1e18 + 27092008;
const int N = 2e5 + 5;
int n, q;
vector<int> G[N];
int chainHead[N], idChain[N], pos[N], tour[N], sz[N], h[N], cur_chain = 1, cur_pos = 0, par[N];
struct Node {
int best, sum, pref, suff, lazy;
friend Node combine(const Node &L, const Node &R) {
Node res;
res.best = max({L.best, R.best, L.suff + R.pref});
res.pref = max(L.pref, L.sum + R.pref);
res.suff = max(R.suff, R.sum + L.suff);
res.sum = L.sum + R.sum;
res.lazy = inf;
return res;
}
} node[N << 2];
void Assign(int id, int l, int r, int k) { // gan k cho node[id]
node[id].sum = (r - l + 1) * k;
node[id].best = node[id].pref = node[id].suff = max(0LL, node[id].sum); // neu k > 0 thi lay toan bo la toi uu, con k < 0 thi ko lay gi la toi uu
node[id].lazy = k;
}
void pushDown(int id, int l, int r) {
if (node[id].lazy != inf) {
int mid = (l + r) >> 1;
Assign(id << 1, l, mid, node[id].lazy);
Assign(id << 1 | 1, mid + 1, r, node[id].lazy);
node[id].lazy = inf;
}
}
void update(int id, int l, int r, int u, int v, int k) {
if (l > v || r < u || u > v) return;
if (u <= l && r <= v) {
Assign(id, l, r, k);
return;
}
pushDown(id, l, r);
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v, k);
update(id << 1 | 1, mid + 1, r, u, v, k);
node[id] = combine(node[id << 1], node[id << 1 | 1]);
}
Node get(int id, int l, int r, int u, int v) {
if (l > v || r < u || u > v) return {-INF, 0, 0, 0, inf};
if (u <= l && r <= v) return node[id];
pushDown(id, l, r);
int mid = (l + r) >> 1;
return combine(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
}
void dfs(int u) {
sz[u] = 1;
for(int v : G[u]) if (v != par[u]) {
par[v] = u;
h[v] = h[u] + 1;
dfs(v);
sz[u] += sz[v];
}
}
void hld(int u) {
if (chainHead[cur_chain] == 0) {
chainHead[cur_chain] = u;
}
idChain[u] = cur_chain;
pos[u] = ++cur_pos;
tour[cur_pos] = u;
int hvy = 0;
for(int v : G[u]) if (v != par[u] && sz[v] > sz[hvy])
hvy = v;
if (hvy > 0) hld(hvy);
for(int v : G[u]) if (v != par[u] && v != hvy) {
cur_chain++;
hld(v);
}
}
int LCA(int u, int v) {
while(idChain[u] != idChain[v]) {
if (idChain[u] < idChain[v]) swap(u, v);
u = par[chainHead[idChain[u]]];
}
return (h[u] < h[v] ? u : v);
}
void updatePath(int u, int v, int c) {
int p = LCA(u, v);
while(idChain[u] != idChain[p]) {
update(1, 1, n, pos[chainHead[idChain[u]]], pos[u], c);
u = par[chainHead[idChain[u]]];
}
while(idChain[v] != idChain[p]) {
update(1, 1, n, pos[chainHead[idChain[v]]], pos[v], c);
v = par[chainHead[idChain[v]]];
}
if (h[u] > h[v]) swap(u, v);
update(1, 1, n, pos[u], pos[v], c);
}
int getPath(int u, int v) {
Node L = {-INF, 0, 0, 0, inf};
Node R = L;
int p = LCA(u, v);
while(idChain[u] != idChain[p]) {
Node cur = get(1, 1, n, pos[chainHead[idChain[u]]], pos[u]);
swap(cur.pref, cur.suff);
L = combine(L, cur);
u = par[chainHead[idChain[u]]];
}
if (u != p) {
Node cur = get(1, 1, n, pos[p] + 1, pos[u]);
swap(cur.pref, cur.suff);
L = combine(L, cur);
}
while(idChain[v] != idChain[p]) {
R = combine(get(1, 1, n, pos[chainHead[idChain[v]]], pos[v]), R);
v = par[chainHead[idChain[v]]];
}
if (v != p) {
R = combine(get(1, 1, n, pos[p] + 1, pos[v]), R);
}
Node mid = get(1, 1, n, pos[p], pos[p]);
return combine(L, combine(mid, R)).best;
}
int a[N];
void build(int id, int l, int r) {
node[id].lazy = inf;
if (l == r) {
node[id].sum = a[tour[l]];
node[id].best = node[id].pref = node[id].suff = max(0LL, node[id].sum);
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
node[id] = combine(node[id << 1], node[id << 1 | 1]);
}
void init(void) {
cin >> n;
FOR(i, 1, n) cin >> a[i];
FOR(i, 2, n) {
int u, v;
cin >> u >> v;
G[u].pb(v);
G[v].pb(u);
}
}
void process(void) {
dfs(1);
hld(1);
build(1, 1, n);
cin >> q;
while(q--) {
int t; cin >> t;
int u, v; cin >> u >> v;
if (t == 2) {
int c; cin >> c;
updatePath(u, v, c);
} else cout << getPath(u, v) << '\n';
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
LyogQVVUSE9SOiBUVUFOIEFOSCAtIEJVSSAqLwovLyB+fiBpY2ViZWFyIH5+CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGludCBsb25nIGxvbmcKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaWk7CnR5cGVkZWYgcGFpcjxpbnQsIGlpPiBpaWk7Cgp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPgogICAgYm9vbCBtaW5pbWl6ZShYICZ4LCBjb25zdCBZICZ5KSB7CiAgICAgICAgaWYgKHggPiB5KSByZXR1cm4geCA9IHksIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KICAgIGJvb2wgbWF4aW1pemUoWCAmeCwgY29uc3QgWSAmeSkgewogICAgICAgIGlmICh4IDwgeSkgcmV0dXJuIHggPSB5LCB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9KGEpOyBpPD0oYik7ICsraSkKI2RlZmluZSBGT1JSKGksYSxiKSBmb3IoaW50IGk9KGEpOyBpPj0oYik7IC0taSkKI2RlZmluZSBSRVAoaSwgbikgZm9yKGludCBpPTA7IGk8KG4pOyArK2kpCiNkZWZpbmUgUkVEKGksIG4pIGZvcihpbnQgaT0obiktMTsgaT49MDsgLS1pKQojZGVmaW5lIE1BU0soaSkgKDFMTCA8PCAoaSkpCiNkZWZpbmUgQklUKFMsIGkpICgoKFMpID4+IChpKSkgJiAxKQojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIHRhc2sgImljZWJlYXIiCi8qRU5EIE9GIFRFTVBMQVRFLiBJQ0VCRUFSIEFORCBUSEUgQ0FUIFdJTEwgV0lOIFZPSTI2ICovCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IGluZiA9IChpbnQpMWU5ICsgMjcwOTIwMDg7CmNvbnN0IGxsIElORiAgPSAobGwpMWUxOCArIDI3MDkyMDA4Owpjb25zdCBpbnQgTiA9IDJlNSArIDU7CmludCBuLCBxOwp2ZWN0b3I8aW50PiBHW05dOwppbnQgY2hhaW5IZWFkW05dLCBpZENoYWluW05dLCBwb3NbTl0sIHRvdXJbTl0sIHN6W05dLCBoW05dLCBjdXJfY2hhaW4gPSAxLCBjdXJfcG9zID0gMCwgcGFyW05dOwoKc3RydWN0IE5vZGUgewogICAgaW50IGJlc3QsIHN1bSwgcHJlZiwgc3VmZiwgbGF6eTsKICAgIGZyaWVuZCBOb2RlIGNvbWJpbmUoY29uc3QgTm9kZSAmTCwgY29uc3QgTm9kZSAmUikgewogICAgICAgIE5vZGUgcmVzOwogICAgICAgIHJlcy5iZXN0ID0gbWF4KHtMLmJlc3QsIFIuYmVzdCwgTC5zdWZmICsgUi5wcmVmfSk7CiAgICAgICAgcmVzLnByZWYgPSBtYXgoTC5wcmVmLCBMLnN1bSArIFIucHJlZik7CiAgICAgICAgcmVzLnN1ZmYgPSBtYXgoUi5zdWZmLCBSLnN1bSArIEwuc3VmZik7CiAgICAgICAgcmVzLnN1bSA9IEwuc3VtICsgUi5zdW07CiAgICAgICAgcmVzLmxhenkgPSBpbmY7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfSBub2RlW04gPDwgMl07Cgp2b2lkIEFzc2lnbihpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IGspIHsgLy8gZ2FuIGsgY2hvIG5vZGVbaWRdCiAgICBub2RlW2lkXS5zdW0gPSAociAtIGwgKyAxKSAqIGs7CiAgICBub2RlW2lkXS5iZXN0ID0gbm9kZVtpZF0ucHJlZiA9IG5vZGVbaWRdLnN1ZmYgPSBtYXgoMExMLCBub2RlW2lkXS5zdW0pOyAvLyBuZXUgayA+IDAgdGhpIGxheSB0b2FuIGJvIGxhIHRvaSB1dSwgY29uIGsgPCAwIHRoaSBrbyBsYXkgZ2kgbGEgdG9pIHV1CiAgICBub2RlW2lkXS5sYXp5ID0gazsKfQoKdm9pZCBwdXNoRG93bihpbnQgaWQsIGludCBsLCBpbnQgcikgewogICAgaWYgKG5vZGVbaWRdLmxhenkgIT0gaW5mKSB7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBBc3NpZ24oaWQgPDwgMSwgbCwgbWlkLCBub2RlW2lkXS5sYXp5KTsKICAgICAgICBBc3NpZ24oaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIG5vZGVbaWRdLmxhenkpOwogICAgICAgIG5vZGVbaWRdLmxhenkgPSBpbmY7CiAgICB9Cn0KCnZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCBrKSB7CiAgICBpZiAobCA+IHYgfHwgciA8IHUgfHwgdSA+IHYpIHJldHVybjsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSB7CiAgICAgICAgQXNzaWduKGlkLCBsLCByLCBrKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwdXNoRG93bihpZCwgbCwgcik7CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgdXBkYXRlKGlkIDw8IDEsIGwsIG1pZCwgdSwgdiwgayk7CiAgICB1cGRhdGUoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYsIGspOwogICAgbm9kZVtpZF0gPSBjb21iaW5lKG5vZGVbaWQgPDwgMV0sIG5vZGVbaWQgPDwgMSB8IDFdKTsKfQoKTm9kZSBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewogICAgaWYgKGwgPiB2IHx8IHIgPCB1IHx8IHUgPiB2KSByZXR1cm4gey1JTkYsIDAsIDAsIDAsIGluZn07CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIG5vZGVbaWRdOwogICAgcHVzaERvd24oaWQsIGwsIHIpOwogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHJldHVybiBjb21iaW5lKGdldChpZCA8PCAxLCBsLCBtaWQsIHUsIHYpLCBnZXQoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYpKTsKfQoKdm9pZCBkZnMoaW50IHUpIHsKICAgIHN6W3VdID0gMTsKICAgIGZvcihpbnQgdiA6IEdbdV0pIGlmICh2ICE9IHBhclt1XSkgewogICAgICAgIHBhclt2XSA9IHU7CiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIGRmcyh2KTsKICAgICAgICBzelt1XSArPSBzelt2XTsKICAgIH0KfQoKdm9pZCBobGQoaW50IHUpIHsKICAgIGlmIChjaGFpbkhlYWRbY3VyX2NoYWluXSA9PSAwKSB7CiAgICAgICAgY2hhaW5IZWFkW2N1cl9jaGFpbl0gPSB1OwogICAgfQogICAgaWRDaGFpblt1XSA9IGN1cl9jaGFpbjsKICAgIHBvc1t1XSA9ICsrY3VyX3BvczsKICAgIHRvdXJbY3VyX3Bvc10gPSB1OwoKICAgIGludCBodnkgPSAwOwogICAgZm9yKGludCB2IDogR1t1XSkgaWYgKHYgIT0gcGFyW3VdICYmIHN6W3ZdID4gc3pbaHZ5XSkKICAgICAgICBodnkgPSB2OwoKICAgIGlmIChodnkgPiAwKSBobGQoaHZ5KTsKCiAgICBmb3IoaW50IHYgOiBHW3VdKSBpZiAodiAhPSBwYXJbdV0gJiYgdiAhPSBodnkpIHsKICAgICAgICBjdXJfY2hhaW4rKzsKICAgICAgICBobGQodik7CiAgICB9Cn0KCmludCBMQ0EoaW50IHUsIGludCB2KSB7CiAgICB3aGlsZShpZENoYWluW3VdICE9IGlkQ2hhaW5bdl0pIHsKICAgICAgICBpZiAoaWRDaGFpblt1XSA8IGlkQ2hhaW5bdl0pIHN3YXAodSwgdik7CiAgICAgICAgdSA9IHBhcltjaGFpbkhlYWRbaWRDaGFpblt1XV1dOwogICAgfQogICAgcmV0dXJuIChoW3VdIDwgaFt2XSA/IHUgOiB2KTsKfQoKdm9pZCB1cGRhdGVQYXRoKGludCB1LCBpbnQgdiwgaW50IGMpIHsKICAgIGludCBwID0gTENBKHUsIHYpOwogICAgd2hpbGUoaWRDaGFpblt1XSAhPSBpZENoYWluW3BdKSB7CiAgICAgICAgdXBkYXRlKDEsIDEsIG4sIHBvc1tjaGFpbkhlYWRbaWRDaGFpblt1XV1dLCBwb3NbdV0sIGMpOwogICAgICAgIHUgPSBwYXJbY2hhaW5IZWFkW2lkQ2hhaW5bdV1dXTsKICAgIH0KICAgIHdoaWxlKGlkQ2hhaW5bdl0gIT0gaWRDaGFpbltwXSkgewogICAgICAgIHVwZGF0ZSgxLCAxLCBuLCBwb3NbY2hhaW5IZWFkW2lkQ2hhaW5bdl1dXSwgcG9zW3ZdLCBjKTsKICAgICAgICB2ID0gcGFyW2NoYWluSGVhZFtpZENoYWluW3ZdXV07CiAgICB9CiAgICBpZiAoaFt1XSA+IGhbdl0pIHN3YXAodSwgdik7CiAgICB1cGRhdGUoMSwgMSwgbiwgcG9zW3VdLCBwb3Nbdl0sIGMpOwp9CgppbnQgZ2V0UGF0aChpbnQgdSwgaW50IHYpIHsKICAgIE5vZGUgTCA9IHstSU5GLCAwLCAwLCAwLCBpbmZ9OwogICAgTm9kZSBSID0gTDsKICAgIGludCBwID0gTENBKHUsIHYpOwogICAgd2hpbGUoaWRDaGFpblt1XSAhPSBpZENoYWluW3BdKSB7CiAgICAgICAgTm9kZSBjdXIgPSBnZXQoMSwgMSwgbiwgcG9zW2NoYWluSGVhZFtpZENoYWluW3VdXV0sIHBvc1t1XSk7CiAgICAgICAgc3dhcChjdXIucHJlZiwgY3VyLnN1ZmYpOwogICAgICAgIEwgPSBjb21iaW5lKEwsIGN1cik7CiAgICAgICAgdSA9IHBhcltjaGFpbkhlYWRbaWRDaGFpblt1XV1dOwogICAgfQogICAgaWYgKHUgIT0gcCkgewogICAgICAgIE5vZGUgY3VyID0gZ2V0KDEsIDEsIG4sIHBvc1twXSArIDEsIHBvc1t1XSk7CiAgICAgICAgc3dhcChjdXIucHJlZiwgY3VyLnN1ZmYpOwogICAgICAgIEwgPSBjb21iaW5lKEwsIGN1cik7CiAgICB9CiAgICB3aGlsZShpZENoYWluW3ZdICE9IGlkQ2hhaW5bcF0pIHsKICAgICAgICBSID0gY29tYmluZShnZXQoMSwgMSwgbiwgcG9zW2NoYWluSGVhZFtpZENoYWluW3ZdXV0sIHBvc1t2XSksIFIpOwogICAgICAgIHYgPSBwYXJbY2hhaW5IZWFkW2lkQ2hhaW5bdl1dXTsKICAgIH0KICAgIGlmICh2ICE9IHApIHsKICAgICAgICBSID0gY29tYmluZShnZXQoMSwgMSwgbiwgcG9zW3BdICsgMSwgcG9zW3ZdKSwgUik7CiAgICB9CiAgICBOb2RlIG1pZCA9IGdldCgxLCAxLCBuLCBwb3NbcF0sIHBvc1twXSk7CiAgICByZXR1cm4gY29tYmluZShMLCBjb21iaW5lKG1pZCwgUikpLmJlc3Q7Cn0KCmludCBhW05dOwp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBub2RlW2lkXS5sYXp5ID0gaW5mOwogICAgaWYgKGwgPT0gcikgewogICAgICAgIG5vZGVbaWRdLnN1bSA9IGFbdG91cltsXV07CiAgICAgICAgbm9kZVtpZF0uYmVzdCA9IG5vZGVbaWRdLnByZWYgPSBub2RlW2lkXS5zdWZmID0gbWF4KDBMTCwgbm9kZVtpZF0uc3VtKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgYnVpbGQoaWQgPDwgMSwgbCwgbWlkKTsKICAgIGJ1aWxkKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByKTsKICAgIG5vZGVbaWRdID0gY29tYmluZShub2RlW2lkIDw8IDFdLCBub2RlW2lkIDw8IDEgfCAxXSk7Cn0KCnZvaWQgaW5pdCh2b2lkKSB7CiAgICBjaW4gPj4gbjsKICAgIEZPUihpLCAxLCBuKSBjaW4gPj4gYVtpXTsKICAgIEZPUihpLCAyLCBuKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICBHW3VdLnBiKHYpOwogICAgICAgIEdbdl0ucGIodSk7CiAgICB9Cn0KCnZvaWQgcHJvY2Vzcyh2b2lkKSB7CiAgICBkZnMoMSk7CiAgICBobGQoMSk7CiAgICBidWlsZCgxLCAxLCBuKTsKICAgIGNpbiA+PiBxOwogICAgd2hpbGUocS0tKSB7CiAgICAgICAgaW50IHQ7IGNpbiA+PiB0OwogICAgICAgIGludCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIGlmICh0ID09IDIpIHsKICAgICAgICAgICAgaW50IGM7IGNpbiA+PiBjOwogICAgICAgICAgICB1cGRhdGVQYXRoKHUsIHYsIGMpOwogICAgICAgIH0gZWxzZSBjb3V0IDw8IGdldFBhdGgodSwgdikgPDwgJ1xuJzsKICAgIH0KfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4odGFzayIuaW5wIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdGMgPSAxOwovLyAgICBjaW4gPj4gdGM7CiAgICB3aGlsZSh0Yy0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHByb2Nlc3MoKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cgo=