#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct Node {
long long sum, pref, suff, ans;
bool is_null;
Node() {
is_null = true;
sum = pref = suff = ans = 0;
}
Node(long long val) {
is_null = false;
sum = val;
pref = suff = ans = max(0LL, val);
}
};
Node merge(const Node& L, const Node& R) {
if (L.is_null) return R;
if (R.is_null) return L;
Node res;
res.is_null = false;
res.sum = L.sum + R.sum;
res.pref = max(L.pref, L.sum + R.pref);
res.suff = max(R.suff, R.sum + L.suff);
res.ans = max({L.ans, R.ans, L.suff + R.pref});
return res;
}
Node reverse_node(Node A) {
if (A.is_null) return A;
swap(A.pref, A.suff);
return A;
}
int n, q;
int A[MAXN];
vector<int> adj[MAXN];
int parent_node[MAXN], depth[MAXN], heavy[MAXN], head[MAXN], pos[MAXN], sz[MAXN];
int cur_pos = 0;
int arr[MAXN];
void dfs_sz(int v, int p, int d) {
sz[v] = 1;
parent_node[v] = p;
depth[v] = d;
heavy[v] = -1;
int max_sub = 0;
for (int u : adj[v]) {
if (u != p) {
dfs_sz(u, v, d + 1);
sz[v] += sz[u];
if (sz[u] > max_sub) {
max_sub = sz[u];
heavy[v] = u;
}
}
}
}
void dfs_hld(int v, int p, int h) {
head[v] = h;
pos[v] = ++cur_pos;
arr[cur_pos] = A[v];
if (heavy[v] != -1) {
dfs_hld(heavy[v], v, h);
}
for (int u : adj[v]) {
if (u != p && u != heavy[v]) {
dfs_hld(u, v, u);
}
}
}
Node tree_seg[4 * MAXN];
void build(int node, int l, int r) {
if (l == r) {
tree_seg[node] = Node(arr[l]);
return;
}
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
tree_seg[node] = merge(tree_seg[2 * node], tree_seg[2 * node + 1]);
}
void update(int node, int l, int r, int idx, long long val) {
if (l == r) {
tree_seg[node] = Node(val);
return;
}
int mid = (l + r) / 2;
if (idx <= mid) update(2 * node, l, mid, idx, val);
else update(2 * node + 1, mid + 1, r, idx, val);
tree_seg[node] = merge(tree_seg[2 * node], tree_seg[2 * node + 1]);
}
Node query_tree(int node, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree_seg[node];
int mid = (l + r) / 2;
if (qr <= mid) return query_tree(2 * node, l, mid, ql, qr);
if (ql > mid) return query_tree(2 * node + 1, mid + 1, r, ql, qr);
return merge(query_tree(2 * node, l, mid, ql, qr), query_tree(2 * node + 1, mid + 1, r, ql, qr));
}
long long query_path(int u, int v) {
Node left_res, right_res;
while (head[u] != head[v]) {
if (depth[head[u]] >= depth[head[v]]) {
Node q_res = query_tree(1, 1, n, pos[head[u]], pos[u]);
left_res = merge(left_res, reverse_node(q_res));
u = parent_node[head[u]];
} else {
Node q_res = query_tree(1, 1, n, pos[head[v]], pos[v]);
right_res = merge(q_res, right_res);
v = parent_node[head[v]];
}
}
if (depth[u] >= depth[v]) {
Node q_res = query_tree(1, 1, n, pos[v], pos[u]);
left_res = merge(left_res, reverse_node(q_res));
} else {
Node q_res = query_tree(1, 1, n, pos[u], pos[v]);
right_res = merge(q_res, right_res);
}
Node final_res = merge(left_res, right_res);
return final_res.ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
if (!(cin >> n >> q)) return 0;
for (int i = 1; i <= n; i++) cin >> A[i];
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs_sz(1, 0, 0);
dfs_hld(1, 0, 1);
build(1, 1, n);
while (q--) {
int type;
cin >> type;
if (type == 1) {
int u;
long long x;
cin >> u >> x;
update(1, 1, n, pos[u], x);
} else {
int u, v;
cin >> u >> v;
cout << query_path(u, v) << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDEwMDAwNTsKc3RydWN0IE5vZGUgewogICAgbG9uZyBsb25nIHN1bSwgcHJlZiwgc3VmZiwgYW5zOwogICAgYm9vbCBpc19udWxsOwoKICAgIE5vZGUoKSB7CiAgICAgICAgaXNfbnVsbCA9IHRydWU7CiAgICAgICAgc3VtID0gcHJlZiA9IHN1ZmYgPSBhbnMgPSAwOwogICAgfQoKICAgIE5vZGUobG9uZyBsb25nIHZhbCkgewogICAgICAgIGlzX251bGwgPSBmYWxzZTsKICAgICAgICBzdW0gPSB2YWw7CiAgICAgICAgcHJlZiA9IHN1ZmYgPSBhbnMgPSBtYXgoMExMLCB2YWwpOwogICAgfQp9OwoKTm9kZSBtZXJnZShjb25zdCBOb2RlJiBMLCBjb25zdCBOb2RlJiBSKSB7CiAgICBpZiAoTC5pc19udWxsKSByZXR1cm4gUjsKICAgIGlmIChSLmlzX251bGwpIHJldHVybiBMOwogICAgTm9kZSByZXM7CiAgICByZXMuaXNfbnVsbCA9IGZhbHNlOwogICAgcmVzLnN1bSA9IEwuc3VtICsgUi5zdW07CiAgICByZXMucHJlZiA9IG1heChMLnByZWYsIEwuc3VtICsgUi5wcmVmKTsKICAgIHJlcy5zdWZmID0gbWF4KFIuc3VmZiwgUi5zdW0gKyBMLnN1ZmYpOwogICAgcmVzLmFucyA9IG1heCh7TC5hbnMsIFIuYW5zLCBMLnN1ZmYgKyBSLnByZWZ9KTsKICAgIHJldHVybiByZXM7Cn0KCk5vZGUgcmV2ZXJzZV9ub2RlKE5vZGUgQSkgewogICAgaWYgKEEuaXNfbnVsbCkgcmV0dXJuIEE7CiAgICBzd2FwKEEucHJlZiwgQS5zdWZmKTsKICAgIHJldHVybiBBOwp9CgppbnQgbiwgcTsKaW50IEFbTUFYTl07CnZlY3RvcjxpbnQ+IGFkaltNQVhOXTsKCmludCBwYXJlbnRfbm9kZVtNQVhOXSwgZGVwdGhbTUFYTl0sIGhlYXZ5W01BWE5dLCBoZWFkW01BWE5dLCBwb3NbTUFYTl0sIHN6W01BWE5dOwppbnQgY3VyX3BvcyA9IDA7CmludCBhcnJbTUFYTl07IAoKdm9pZCBkZnNfc3ooaW50IHYsIGludCBwLCBpbnQgZCkgewogICAgc3pbdl0gPSAxOwogICAgcGFyZW50X25vZGVbdl0gPSBwOwogICAgZGVwdGhbdl0gPSBkOwogICAgaGVhdnlbdl0gPSAtMTsKICAgIGludCBtYXhfc3ViID0gMDsKICAgIGZvciAoaW50IHUgOiBhZGpbdl0pIHsKICAgICAgICBpZiAodSAhPSBwKSB7CiAgICAgICAgICAgIGRmc19zeih1LCB2LCBkICsgMSk7CiAgICAgICAgICAgIHN6W3ZdICs9IHN6W3VdOwogICAgICAgICAgICBpZiAoc3pbdV0gPiBtYXhfc3ViKSB7CiAgICAgICAgICAgICAgICBtYXhfc3ViID0gc3pbdV07CiAgICAgICAgICAgICAgICBoZWF2eVt2XSA9IHU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZGZzX2hsZChpbnQgdiwgaW50IHAsIGludCBoKSB7CiAgICBoZWFkW3ZdID0gaDsKICAgIHBvc1t2XSA9ICsrY3VyX3BvczsKICAgIGFycltjdXJfcG9zXSA9IEFbdl07CgogICAgaWYgKGhlYXZ5W3ZdICE9IC0xKSB7CiAgICAgICAgZGZzX2hsZChoZWF2eVt2XSwgdiwgaCk7CiAgICB9CgogICAgZm9yIChpbnQgdSA6IGFkalt2XSkgewogICAgICAgIGlmICh1ICE9IHAgJiYgdSAhPSBoZWF2eVt2XSkgewogICAgICAgICAgICBkZnNfaGxkKHUsIHYsIHUpOwogICAgICAgIH0KICAgIH0gIAp9Ck5vZGUgdHJlZV9zZWdbNCAqIE1BWE5dOwoKdm9pZCBidWlsZChpbnQgbm9kZSwgaW50IGwsIGludCByKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgdHJlZV9zZWdbbm9kZV0gPSBOb2RlKGFycltsXSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgYnVpbGQoMiAqIG5vZGUsIGwsIG1pZCk7CiAgICBidWlsZCgyICogbm9kZSArIDEsIG1pZCArIDEsIHIpOwogICAgdHJlZV9zZWdbbm9kZV0gPSBtZXJnZSh0cmVlX3NlZ1syICogbm9kZV0sIHRyZWVfc2VnWzIgKiBub2RlICsgMV0pOwp9Cgp2b2lkIHVwZGF0ZShpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgaWR4LCBsb25nIGxvbmcgdmFsKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgdHJlZV9zZWdbbm9kZV0gPSBOb2RlKHZhbCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgaWYgKGlkeCA8PSBtaWQpIHVwZGF0ZSgyICogbm9kZSwgbCwgbWlkLCBpZHgsIHZhbCk7CiAgICBlbHNlIHVwZGF0ZSgyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIGlkeCwgdmFsKTsKICAgIHRyZWVfc2VnW25vZGVdID0gbWVyZ2UodHJlZV9zZWdbMiAqIG5vZGVdLCB0cmVlX3NlZ1syICogbm9kZSArIDFdKTsKfQoKTm9kZSBxdWVyeV90cmVlKGludCBub2RlLCBpbnQgbCwgaW50IHIsIGludCBxbCwgaW50IHFyKSB7CiAgICBpZiAocWwgPD0gbCAmJiByIDw9IHFyKSByZXR1cm4gdHJlZV9zZWdbbm9kZV07CiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICBpZiAocXIgPD0gbWlkKSByZXR1cm4gcXVlcnlfdHJlZSgyICogbm9kZSwgbCwgbWlkLCBxbCwgcXIpOwogICAgaWYgKHFsID4gbWlkKSByZXR1cm4gcXVlcnlfdHJlZSgyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIHFsLCBxcik7CiAgICByZXR1cm4gbWVyZ2UocXVlcnlfdHJlZSgyICogbm9kZSwgbCwgbWlkLCBxbCwgcXIpLCBxdWVyeV90cmVlKDIgKiBub2RlICsgMSwgbWlkICsgMSwgciwgcWwsIHFyKSk7Cn0KCmxvbmcgbG9uZyBxdWVyeV9wYXRoKGludCB1LCBpbnQgdikgewogICAgTm9kZSBsZWZ0X3JlcywgcmlnaHRfcmVzOyAKCiAgICB3aGlsZSAoaGVhZFt1XSAhPSBoZWFkW3ZdKSB7CiAgICAgICAgaWYgKGRlcHRoW2hlYWRbdV1dID49IGRlcHRoW2hlYWRbdl1dKSB7CiAgICAgICAgICAgIE5vZGUgcV9yZXMgPSBxdWVyeV90cmVlKDEsIDEsIG4sIHBvc1toZWFkW3VdXSwgcG9zW3VdKTsKICAgICAgICAgICAgbGVmdF9yZXMgPSBtZXJnZShsZWZ0X3JlcywgcmV2ZXJzZV9ub2RlKHFfcmVzKSk7CiAgICAgICAgICAgIHUgPSBwYXJlbnRfbm9kZVtoZWFkW3VdXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBOb2RlIHFfcmVzID0gcXVlcnlfdHJlZSgxLCAxLCBuLCBwb3NbaGVhZFt2XV0sIHBvc1t2XSk7CiAgICAgICAgICAgIHJpZ2h0X3JlcyA9IG1lcmdlKHFfcmVzLCByaWdodF9yZXMpOwogICAgICAgICAgICB2ID0gcGFyZW50X25vZGVbaGVhZFt2XV07CiAgICAgICAgfQogICAgfQoKICAgIGlmIChkZXB0aFt1XSA+PSBkZXB0aFt2XSkgewogICAgICAgIE5vZGUgcV9yZXMgPSBxdWVyeV90cmVlKDEsIDEsIG4sIHBvc1t2XSwgcG9zW3VdKTsKICAgICAgICBsZWZ0X3JlcyA9IG1lcmdlKGxlZnRfcmVzLCByZXZlcnNlX25vZGUocV9yZXMpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgTm9kZSBxX3JlcyA9IHF1ZXJ5X3RyZWUoMSwgMSwgbiwgcG9zW3VdLCBwb3Nbdl0pOwogICAgICAgIHJpZ2h0X3JlcyA9IG1lcmdlKHFfcmVzLCByaWdodF9yZXMpOwogICAgfQoKICAgIE5vZGUgZmluYWxfcmVzID0gbWVyZ2UobGVmdF9yZXMsIHJpZ2h0X3Jlcyk7CiAgICByZXR1cm4gZmluYWxfcmVzLmFuczsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjb3V0LnRpZShOVUxMKTsKCiAgICBpZiAoIShjaW4gPj4gbiA+PiBxKSkgcmV0dXJuIDA7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gQVtpXTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgZGZzX3N6KDEsIDAsIDApOwogICAgZGZzX2hsZCgxLCAwLCAxKTsKICAgIGJ1aWxkKDEsIDEsIG4pOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0eXBlOwogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IHU7CiAgICAgICAgICAgIGxvbmcgbG9uZyB4OwogICAgICAgICAgICBjaW4gPj4gdSA+PiB4OwogICAgICAgICAgICB1cGRhdGUoMSwgMSwgbiwgcG9zW3VdLCB4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgdSwgdjsKICAgICAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICAgICAgY291dCA8PCBxdWVyeV9wYXRoKHUsIHYpIDw8ICJcbiI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9Cg==