func_code_string: #include <bits/stdc++.h>   using namespace std;   using namespace std;   long long powm(long long base, long long exp, long long mod = 1000000007) {     long long ans = 1;     while (exp) {       if (exp & 1) ans = (ans * base) % mod;       exp >>= 1, base = (base * base) % mod;     }     return ans;   }   long long n, u, v, a[200005], st[2][200005], en[2][200005], timer[2],       tour[2][200005], level[200005], parent[200005], ft[2][200005];   vector<long long> adj[200005];   void dfs(long long mode, long long curr, long long par, long long now) {     parent[curr] = par, level[curr] = now;     if (now == mode)       st[mode][curr] = (++timer[mode]), tour[mode][timer[mode]] = curr;     for (auto i : adj[curr])       if (i != par) dfs(mode, i, curr, now ^ 1);     if (now == mode) en[mode][curr] = timer[mode];   }   void update(long long mode, long long p, long long val) {     long long curr = p;     for (; curr <= 200005; curr += (curr & (-curr))) ft[mode][curr] += val;   }   void update(long long mode, long long a, long long b, long long val) {     update(mode, a, val), update(mode, b + 1, -val);   }   long long query(long long mode, long long idx) {     long long sum = 0, curr = idx;     for (; curr > 0; curr -= (curr & (-curr))) sum += ft[mode][curr];     return sum;   }   int main() {     long long type, x, val, m;     cin >> n >> m;     for (long long i = 1; i < n + 1; i++) cin >> a[i];     for (long long i = 0; i < n - 1; i++) {       cin >> u >> v;       adj[u].push_back(v), adj[v].push_back(u);     }     for (long long i = 0; i < 2; i++) dfs(i, 1, 0, 0);     while (m--) {       cin >> type;       if (type == 1) {         cin >> x >> val;         long long mode = level[x], tmp = adj[x].size();         long long p = st[mode][x], q = en[mode][x], first = -1, last = -1;         update(mode, p, q, val);         for (auto i : adj[x])           if (i != parent[x]) {             first = i;             break;           }         for (long long i = tmp - 1; i >= 0; i--)           if (adj[x][i] != parent[x]) {             last = adj[x][i];             break;           }         if (first != -1) {           mode ^= 1;           p = st[mode][first], q = en[mode][last];           update(mode, p, q, -val);         }       } else {         cin >> x;         cout << query(level[x], st[level[x]][x]) + a[x] << endl;       }     }     return 0;   }   