func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2e5 + 1;   vector<int> e[N];   int s[N], seg[N << 2], num[N << 2], chg[N << 2], dfn[N][2], dfsns[N],       sgn[N] = {-1}, stamp;   void dfs(int now, int pre) {     dfn[now][0] = ++stamp;     dfsns[stamp] = now;     sgn[dfn[now][0]] = sgn[dfn[pre][0]] == 1 ? -1 : 1;     for (int i = 0; i < e[now].size(); i++)       if (e[now][i] != pre) dfs(e[now][i], now);     dfn[now][1] = stamp;   }   void pushup(int rt) { seg[rt] = seg[rt << 1] + seg[rt << 1 | 1]; }   void pushdown(int rt, int l, int r) {     if (chg[rt]) {       seg[rt << 1] += num[rt << 1] * chg[rt];       seg[rt << 1 | 1] += num[rt << 1 | 1] * chg[rt];       chg[rt << 1] += chg[rt];       chg[rt << 1 | 1] += chg[rt];       chg[rt] = 0;     }   }   void build(int l, int r, int rt) {     if (l == r) {       seg[rt] = s[dfsns[l]];       num[rt] = sgn[l];       return;     }     int m = l + r >> 1;     build(l, m, rt << 1);     build(m + 1, r, rt << 1 | 1);     num[rt] = num[rt << 1] + num[rt << 1 | 1];     pushup(rt);   }   void update(int l, int r, int rt, int L, int R, int v) {     if (L <= l && r <= R) {       seg[rt] += num[rt] * v;       chg[rt] += v;       return;     }     int m = l + r >> 1;     pushdown(rt, l, r);     if (L <= m) update(l, m, rt << 1, L, R, v);     if (m < R) update(m + 1, r, rt << 1 | 1, L, R, v);     pushup(rt);   }   int query(int l, int r, int rt, int p) {     if (l == r) return seg[rt];     int m = l + r >> 1;     pushdown(rt, l, r);     if (p <= m)       return query(l, m, rt << 1, p);     else       return query(m + 1, r, rt << 1 | 1, p);   }   int main() {     ios::sync_with_stdio(0);     int n, k;     cin >> n >> k;     for (int i = 1; i <= n; i++) cin >> s[i];     for (int i = 1; i < n; i++) {       int tmp1, tmp2;       cin >> tmp1 >> tmp2;       e[tmp1].push_back(tmp2);       e[tmp2].push_back(tmp1);     }     dfs(1, 0);     build(1, n, 1);     for (int i = 0; i < k; i++) {       int op, tmp1, tmp2;       cin >> op;       if (op == 1) {         cin >> tmp1 >> tmp2;         update(1, n, 1, dfn[tmp1][0], dfn[tmp1][1], sgn[dfn[tmp1][0]] * tmp2);       } else {         cin >> tmp1;         cout << query(1, n, 1, dfn[tmp1][0]) << endl;       }     }     return 0;   }   