func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e5 + 10;   const int M = 128;   const int inf = 0x7fffffff;   const long long INF = 9E18;   const int mod = 1e9 + 7;   int tree[maxn << 2][2], a[maxn];   int in[maxn], out[maxn], dis[maxn];   int dfs_clock = 0;   vector<int> g[maxn];   void dfs(int u, int fa) {     dis[u] = dis[fa] ^ 1;     in[u] = ++dfs_clock;     for (int i = 0; i < g[u].size(); i++) {       int to = g[u][i];       if (to == fa) continue;       dfs(to, u);     }     out[u] = dfs_clock;   }   void pushdown(int rt, int odd) {     if (tree[rt][odd]) {       tree[rt << 1 | 1][odd] += tree[rt][odd];       tree[rt << 1][odd] += tree[rt][odd];       tree[rt][odd] = 0;     }   }   void update(int x, int y, int l, int r, int val, int odd, int rt) {     if (x <= l && r <= y) {       tree[rt][odd] += val;       return;     }     pushdown(rt, odd);     int mid = (l + r) >> 1;     if (x <= mid) update(x, y, l, mid, val, odd, rt << 1);     if (y > mid) update(x, y, mid + 1, r, val, odd, rt << 1 | 1);   }   int query(int p, int l, int r, int rt, int odd) {     if (l == r) {       return tree[rt][odd];     }     pushdown(rt, odd);     int mid = (l + r) >> 1;     if (p <= mid)       return query(p, l, mid, rt << 1, odd);     else       return query(p, mid + 1, r, rt << 1 | 1, odd);   }   int main() {     int n, m;     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++) scanf( %d , &a[i]);     for (int i = 0; i < n - 1; i++) {       int x, y;       scanf( %d%d , &x, &y);       g[x].push_back(y);       g[y].push_back(x);     }     dis[0] = 0;     dfs(1, 0);     for (int i = 0; i < m; i++) {       int op;       scanf( %d , &op);       if (op == 1) {         int x, val;         scanf( %d%d , &x, &val);         update(in[x], out[x], 1, n, val, dis[x], 1);         update(in[x], out[x], 1, n, -val, dis[x] ^ 1, 1);       } else {         int num;         scanf( %d , &num);         cout << query(in[num], 1, n, 1, dis[num]) + a[num] <<   n ;       }     }     return 0;   }   