#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 2e5 + 7;
const ll INF = 1e18;
struct Node {
ll sum, pre, suf, ma;
Node() : sum(0), pre(-INF), suf(-INF), ma(-INF) {}
Node(ll val) : sum(val), pre(val), suf(val), ma(val) {}
};
Node merge(const Node& a, const Node& b) {
Node res;
res.sum = a.sum + b.sum;
res.pre = max(a.pre, a.sum + b.pre);
res.suf = max(b.suf, a.suf + b.sum);
res.ma = max({a.ma, b.ma, a.suf + b.pre});
return res;
}
struct SegmentTree {
vector<Node> t;
vector<ll> lazy;
int n;
SegmentTree(int size) {
n = size;
t.resize(4 * n + 7);
lazy.resize(4 * n + 7, INF);
}
void push(int id, int l, int r) {
if (lazy[id] == INF) return;
ll x = lazy[id];
t[id] = Node(x * (r - l + 1));
if (l != r) {
lazy[2 * id] = x;
lazy[2 * id + 1] = x;
}
lazy[id] = INF;
}
void build(int id, int l, int r, const vector<ll>& a) {
if (l == r) {
t[id] = Node(a[l]);
return;
}
int mid = (l + r) / 2;
build(2 * id, l, mid, a);
build(2 * id + 1, mid + 1, r, a);
t[id] = merge(t[2 * id], t[2 * id + 1]);
}
void update(int id, int l, int r, int u, int v, ll x) {
push(id, l, r);
if (v < l || r < u) return;
if (u <= l && r <= v) {
lazy[id] = x;
push(id, l, r);
return;
}
int mid = (l + r) / 2;
update(2 * id, l, mid, u, v, x);
update(2 * id + 1, mid + 1, r, u, v, x);
t[id] = merge(t[2 * id], t[2 * id + 1]);
}
Node query(int id, int l, int r, int u, int v) {
push(id, l, r);
if (v < l || r < u) return Node();
if (u <= l && r <= v) return t[id];
int mid = (l + r) / 2;
return merge(query(2 * id, l, mid, u, v),
query(2 * id + 1, mid + 1, r, u, v));
}
};
struct HLD {
int n;
vector<int> parent, depth, heavy, head, pos;
vector<vector<int>> adj;
int cur_pos;
SegmentTree st;
HLD(int n) : n(n), st(n), parent(n+1), depth(n+1),
heavy(n+1, -1), head(n+1), pos(n+1), adj(n+1), cur_pos(0) {}
void add_edge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u);
}
int dfs(int v) {
int size = 1;
int max_c_size = 0;
for (int c : adj[v]) {
if (c != parent[v]) {
parent[c] = v;
depth[c] = depth[v] + 1;
int c_size = dfs(c);
size += c_size;
if (c_size > max_c_size) {
max_c_size = c_size;
heavy[v] = c;
}
}
}
return size;
}
void decompose(int v, int h) {
head[v] = h;
pos[v] = cur_pos++;
if (heavy[v] != -1)
decompose(heavy[v], h);
for (int c : adj[v]) {
if (c != parent[v] && c != heavy[v])
decompose(c, c);
}
}
void init(vector<ll>& a) {
dfs(1);
decompose(1, 1);
vector<ll> arr(n);
for (int i = 1; i <= n; i++)
arr[pos[i]] = a[i];
st.build(1, 0, n-1, arr);
}
void update_path(int u, int v, ll x) {
for (; head[u] != head[v]; v = parent[head[v]]) {
if (depth[head[u]] > depth[head[v]]) swap(u, v);
st.update(1, 0, n-1, pos[head[v]], pos[v], x);
}
if (depth[u] > depth[v]) swap(u, v);
st.update(1, 0, n-1, pos[u], pos[v], x);
}
Node query_path(int u, int v) {
Node res;
bool first = true;
for (; head[u] != head[v]; v = parent[head[v]]) {
if (depth[head[u]] > depth[head[v]]) swap(u, v);
Node cur = st.query(1, 0, n-1, pos[head[v]], pos[v]);
if (first) {
res = cur;
first = false;
} else {
res = merge(cur, res);
}
}
if (depth[u] > depth[v]) swap(u, v);
Node last = st.query(1, 0, n-1, pos[u], pos[v]);
if (first) return last;
return merge(last, res);
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<ll> a(n+1);
for (int i = 1; i <= n; i++) cin >> a[i];
HLD hld(n);
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
hld.add_edge(u, v);
}
hld.init(a);
while (q--) {
int type, u, v;
cin >> type >> u >> v;
if (type == 1) {
Node res = hld.query_path(u, v);
cout << max(0LL, res.ma) << "\n";
} else {
ll x;
cin >> x;
hld.update_path(u, v, x);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpjb25zdCBpbnQgTUFYTiA9IDJlNSArIDc7CmNvbnN0IGxsIElORiA9IDFlMTg7CgpzdHJ1Y3QgTm9kZSB7CiAgICBsbCBzdW0sIHByZSwgc3VmLCBtYTsKICAgIE5vZGUoKSA6IHN1bSgwKSwgcHJlKC1JTkYpLCBzdWYoLUlORiksIG1hKC1JTkYpIHt9CiAgICBOb2RlKGxsIHZhbCkgOiBzdW0odmFsKSwgcHJlKHZhbCksIHN1Zih2YWwpLCBtYSh2YWwpIHt9Cn07CgpOb2RlIG1lcmdlKGNvbnN0IE5vZGUmIGEsIGNvbnN0IE5vZGUmIGIpIHsKICAgIE5vZGUgcmVzOwogICAgcmVzLnN1bSA9IGEuc3VtICsgYi5zdW07CiAgICByZXMucHJlID0gbWF4KGEucHJlLCBhLnN1bSArIGIucHJlKTsKICAgIHJlcy5zdWYgPSBtYXgoYi5zdWYsIGEuc3VmICsgYi5zdW0pOwogICAgcmVzLm1hID0gbWF4KHthLm1hLCBiLm1hLCBhLnN1ZiArIGIucHJlfSk7CiAgICByZXR1cm4gcmVzOwp9CgpzdHJ1Y3QgU2VnbWVudFRyZWUgewogICAgdmVjdG9yPE5vZGU+IHQ7CiAgICB2ZWN0b3I8bGw+IGxhenk7CiAgICBpbnQgbjsKCiAgICBTZWdtZW50VHJlZShpbnQgc2l6ZSkgewogICAgICAgIG4gPSBzaXplOwogICAgICAgIHQucmVzaXplKDQgKiBuICsgNyk7CiAgICAgICAgbGF6eS5yZXNpemUoNCAqIG4gKyA3LCBJTkYpOwogICAgfQoKICAgIHZvaWQgcHVzaChpbnQgaWQsIGludCBsLCBpbnQgcikgewogICAgICAgIGlmIChsYXp5W2lkXSA9PSBJTkYpIHJldHVybjsKICAgICAgICBsbCB4ID0gbGF6eVtpZF07CiAgICAgICAgdFtpZF0gPSBOb2RlKHggKiAociAtIGwgKyAxKSk7CiAgICAgICAgaWYgKGwgIT0gcikgewogICAgICAgICAgICBsYXp5WzIgKiBpZF0gPSB4OwogICAgICAgICAgICBsYXp5WzIgKiBpZCArIDFdID0geDsKICAgICAgICB9CiAgICAgICAgbGF6eVtpZF0gPSBJTkY7CiAgICB9CgogICAgdm9pZCBidWlsZChpbnQgaWQsIGludCBsLCBpbnQgciwgY29uc3QgdmVjdG9yPGxsPiYgYSkgewogICAgICAgIGlmIChsID09IHIpIHsKICAgICAgICAgICAgdFtpZF0gPSBOb2RlKGFbbF0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgICAgICBidWlsZCgyICogaWQsIGwsIG1pZCwgYSk7CiAgICAgICAgYnVpbGQoMiAqIGlkICsgMSwgbWlkICsgMSwgciwgYSk7CiAgICAgICAgdFtpZF0gPSBtZXJnZSh0WzIgKiBpZF0sIHRbMiAqIGlkICsgMV0pOwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGxsIHgpIHsKICAgICAgICBwdXNoKGlkLCBsLCByKTsKICAgICAgICBpZiAodiA8IGwgfHwgciA8IHUpIHJldHVybjsKICAgICAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgICAgICBsYXp5W2lkXSA9IHg7CiAgICAgICAgICAgIHB1c2goaWQsIGwsIHIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgICAgICB1cGRhdGUoMiAqIGlkLCBsLCBtaWQsIHUsIHYsIHgpOwogICAgICAgIHVwZGF0ZSgyICogaWQgKyAxLCBtaWQgKyAxLCByLCB1LCB2LCB4KTsKICAgICAgICB0W2lkXSA9IG1lcmdlKHRbMiAqIGlkXSwgdFsyICogaWQgKyAxXSk7CiAgICB9CgogICAgTm9kZSBxdWVyeShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICAgICAgcHVzaChpZCwgbCwgcik7CiAgICAgICAgaWYgKHYgPCBsIHx8IHIgPCB1KSByZXR1cm4gTm9kZSgpOwogICAgICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gdFtpZF07CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIHJldHVybiBtZXJnZShxdWVyeSgyICogaWQsIGwsIG1pZCwgdSwgdiksIAogICAgICAgICAgICAgICAgICAgIHF1ZXJ5KDIgKiBpZCArIDEsIG1pZCArIDEsIHIsIHUsIHYpKTsKICAgIH0KfTsKCnN0cnVjdCBITEQgewogICAgaW50IG47CiAgICB2ZWN0b3I8aW50PiBwYXJlbnQsIGRlcHRoLCBoZWF2eSwgaGVhZCwgcG9zOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGo7CiAgICBpbnQgY3VyX3BvczsKICAgIFNlZ21lbnRUcmVlIHN0OwoKICAgIEhMRChpbnQgbikgOiBuKG4pLCBzdChuKSwgcGFyZW50KG4rMSksIGRlcHRoKG4rMSksIAogICAgICAgICAgICAgICAgaGVhdnkobisxLCAtMSksIGhlYWQobisxKSwgcG9zKG4rMSksIGFkaihuKzEpLCBjdXJfcG9zKDApIHt9CgogICAgdm9pZCBhZGRfZWRnZShpbnQgdSwgaW50IHYpIHsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CgogICAgaW50IGRmcyhpbnQgdikgewogICAgICAgIGludCBzaXplID0gMTsKICAgICAgICBpbnQgbWF4X2Nfc2l6ZSA9IDA7CiAgICAgICAgZm9yIChpbnQgYyA6IGFkalt2XSkgewogICAgICAgICAgICBpZiAoYyAhPSBwYXJlbnRbdl0pIHsKICAgICAgICAgICAgICAgIHBhcmVudFtjXSA9IHY7CiAgICAgICAgICAgICAgICBkZXB0aFtjXSA9IGRlcHRoW3ZdICsgMTsKICAgICAgICAgICAgICAgIGludCBjX3NpemUgPSBkZnMoYyk7CiAgICAgICAgICAgICAgICBzaXplICs9IGNfc2l6ZTsKICAgICAgICAgICAgICAgIGlmIChjX3NpemUgPiBtYXhfY19zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4X2Nfc2l6ZSA9IGNfc2l6ZTsKICAgICAgICAgICAgICAgICAgICBoZWF2eVt2XSA9IGM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgdm9pZCBkZWNvbXBvc2UoaW50IHYsIGludCBoKSB7CiAgICAgICAgaGVhZFt2XSA9IGg7CiAgICAgICAgcG9zW3ZdID0gY3VyX3BvcysrOwogICAgICAgIGlmIChoZWF2eVt2XSAhPSAtMSkKICAgICAgICAgICAgZGVjb21wb3NlKGhlYXZ5W3ZdLCBoKTsKICAgICAgICBmb3IgKGludCBjIDogYWRqW3ZdKSB7CiAgICAgICAgICAgIGlmIChjICE9IHBhcmVudFt2XSAmJiBjICE9IGhlYXZ5W3ZdKQogICAgICAgICAgICAgICAgZGVjb21wb3NlKGMsIGMpOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIGluaXQodmVjdG9yPGxsPiYgYSkgewogICAgICAgIGRmcygxKTsKICAgICAgICBkZWNvbXBvc2UoMSwgMSk7CiAgICAgICAgdmVjdG9yPGxsPiBhcnIobik7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgICAgICBhcnJbcG9zW2ldXSA9IGFbaV07CiAgICAgICAgc3QuYnVpbGQoMSwgMCwgbi0xLCBhcnIpOwogICAgfQoKICAgIHZvaWQgdXBkYXRlX3BhdGgoaW50IHUsIGludCB2LCBsbCB4KSB7CiAgICAgICAgZm9yICg7IGhlYWRbdV0gIT0gaGVhZFt2XTsgdiA9IHBhcmVudFtoZWFkW3ZdXSkgewogICAgICAgICAgICBpZiAoZGVwdGhbaGVhZFt1XV0gPiBkZXB0aFtoZWFkW3ZdXSkgc3dhcCh1LCB2KTsKICAgICAgICAgICAgc3QudXBkYXRlKDEsIDAsIG4tMSwgcG9zW2hlYWRbdl1dLCBwb3Nbdl0sIHgpOwogICAgICAgIH0KICAgICAgICBpZiAoZGVwdGhbdV0gPiBkZXB0aFt2XSkgc3dhcCh1LCB2KTsKICAgICAgICBzdC51cGRhdGUoMSwgMCwgbi0xLCBwb3NbdV0sIHBvc1t2XSwgeCk7CiAgICB9CgogICAgTm9kZSBxdWVyeV9wYXRoKGludCB1LCBpbnQgdikgewogICAgICAgIE5vZGUgcmVzOwogICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICAgIGZvciAoOyBoZWFkW3VdICE9IGhlYWRbdl07IHYgPSBwYXJlbnRbaGVhZFt2XV0pIHsKICAgICAgICAgICAgaWYgKGRlcHRoW2hlYWRbdV1dID4gZGVwdGhbaGVhZFt2XV0pIHN3YXAodSwgdik7CiAgICAgICAgICAgIE5vZGUgY3VyID0gc3QucXVlcnkoMSwgMCwgbi0xLCBwb3NbaGVhZFt2XV0sIHBvc1t2XSk7CiAgICAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgICAgcmVzID0gY3VyOwogICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlcyA9IG1lcmdlKGN1ciwgcmVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZGVwdGhbdV0gPiBkZXB0aFt2XSkgc3dhcCh1LCB2KTsKICAgICAgICBOb2RlIGxhc3QgPSBzdC5xdWVyeSgxLCAwLCBuLTEsIHBvc1t1XSwgcG9zW3ZdKTsKICAgICAgICBpZiAoZmlyc3QpIHJldHVybiBsYXN0OwogICAgICAgIHJldHVybiBtZXJnZShsYXN0LCByZXMpOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4sIHE7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgdmVjdG9yPGxsPiBhKG4rMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOwoKICAgIEhMRCBobGQobik7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgaGxkLmFkZF9lZGdlKHUsIHYpOwogICAgfQoKICAgIGhsZC5pbml0KGEpOwoKICAgIHdoaWxlIChxLS0pIHsKICAgICAgICBpbnQgdHlwZSwgdSwgdjsKICAgICAgICBjaW4gPj4gdHlwZSA+PiB1ID4+IHY7CiAgICAgICAgaWYgKHR5cGUgPT0gMSkgewogICAgICAgICAgICBOb2RlIHJlcyA9IGhsZC5xdWVyeV9wYXRoKHUsIHYpOwogICAgICAgICAgICBjb3V0IDw8IG1heCgwTEwsIHJlcy5tYSkgPDwgIlxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsbCB4OwogICAgICAgICAgICBjaW4gPj4geDsKICAgICAgICAgICAgaGxkLnVwZGF0ZV9wYXRoKHUsIHYsIHgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQ==