#include using namespace std; template typename enable_if::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){ os << "[ "; for(auto &x : v) os << x << ' '; return os << "]"; } template Ostream& operator << (Ostream &os, const pair &p){ return os << "{" << p.first << ", " << p.second << "}"; } void dbg_cerr() { cerr << "\e[0m\n"; } template void dbg_cerr(Head H, Tail... T) { cerr << ' ' << H; dbg_cerr(T...); } #ifdef LTF #define DEBUG(...) cerr << "\e[1;31m[" #__VA_ARGS__ "]:", dbg_cerr(__VA_ARGS__) #else #define DEBUG(...) #endif template struct Fenwick { int n; vector v; Fenwick(int n_): n(n_) { v.resize(n + 1, 0); } void add(int x, T d) { for (int i = x; i <= n; i += i & -i) v[i] += d; } T query(int x) { T res = 0; for (int i = x; i; i -= i & -i) res += v[i]; return res; } }; void Solve() { int N, Q; cin >> N >> Q; vector a(N + 1); for (int i = 1; i <= N; i++) cin >> a[i]; vector g(N + 1, vector()); for (int i = 0; i < N - 1; i++) { int x, y; cin >> x >> y; g[x].push_back(y), g[y].push_back(x); } vector chsum(N + 1); constexpr int kC = 19; vector anc(kC, vector(N + 1, 0)); vector in(N + 1), out(N + 1); int dfs_clock = 0; auto Dfs = [&](auto self, int u, int fa) -> void { anc[0][u] = fa; in[u] = ++dfs_clock; for (int v : g[u]) { if (v == fa) continue; self(self, v, u); chsum[u] += a[v]; } out[u] = dfs_clock; }; auto is_ancestor = [&](int u, int v) { return in[u] <= in[v] && out[u] >= out[v]; }; Dfs(Dfs, 1, 0); out[0] = dfs_clock; for (int j = 1; j < kC; j++) { for (int i = 1; i <= N; i++) { anc[j][i] = anc[j - 1][anc[j - 1][i]]; } } auto lca = [&](int u, int v) { if (is_ancestor(u, v)) return u; if (is_ancestor(v, u)) return v; for (int i = kC - 1; i >= 0; i--) { if (!is_ancestor(anc[i][u], v)) { u = anc[i][u]; } } return anc[0][u]; }; Fenwick tree(N); for (int i = 1; i <= N; i++) { // [in[u], out[u]] will get chsum[u] tree.add(in[i], chsum[i]); tree.add(out[i] + 1, -chsum[i]); } while (Q--) { int op, u, v; cin >> op >> u >> v; if (op == 0) { // a[u] += v a[u] += v; int p = anc[0][u]; if (p) { chsum[p] += v; tree.add(in[p], v); tree.add(out[p] + 1, -v); } } else { // sum of chsum on path u--v + a[lca(u, v)] + a[p[lca(u, v)]] int l = lca(u, v); int p = anc[0][l];; int64_t ans = tree.query(in[u]) + tree.query(in[v]) - 2 * tree.query(in[l]) + chsum[l]; ans += a[l]; if (p) ans += a[p]; cout << ans << '\n'; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int T = 1; // cin >> T; while (T--) { Solve(); } return 0; }