#include <bits/stdc++.h>   using namespace std;   const double PI =       3.14159265358979323846264338327950288419716939937510582097494459230;   void swaps(char *x, char *y) {     char temp;     temp = *x;     *x = *y;     *y = temp;   }   void swapi(int *a, int *b) {     int temp;     temp = *a;     *a = *b;     *b = temp;   }   unsigned long long gcd(unsigned long long a, unsigned long long b) {     if (a == 0) return b;     if (b == 0) return a;     if (a == 1 || b == 1) return 1;     if (a == b) return a;     if (a > b)       return gcd(b, a % b);     else       return gcd(a, b % a);   }   long long Tree[4000010];   int V[4000010];   int N;   int Time;   int Outtime[4000010];   int Intime[4000010];   int Lvl[4000010];   int maxval;   bool vis[4000010];   std::vector<std::vector<int> > Edge(2000010);   void Add(int idx, int val) {     for (int i = idx; i <= maxval; i += (i & -i)) Tree[i] += val;   }   long long Query(int idx) {     long long S = 0;     for (int i = idx; i > 0; i -= (i & -i)) S += Tree[i];     return S;   }   void dfs(int idx) {     vis[idx] = true;     Intime[idx] = ++Time;     vis[idx] = true;     for (int i = 0; i < Edge[idx].size(); i++) {       if (vis[Edge[idx][i]]) continue;       Lvl[Edge[idx][i]] = Lvl[idx] + 1;       dfs(Edge[idx][i]);     }     Outtime[idx] = ++Time;   }   int main() {     int Cases = 1;     for (int Case = 0; Case < Cases; Case++) {       int u, v, opt, node, Q;       cin >> N >> Q;       for (int i = 1; i <= N; i++) cin >> V[i];       for (int i = 0; i < N - 1; i++) {         cin >> u >> v;         Edge[u].push_back(v);         Edge[v].push_back(u);       }       dfs(1);       maxval = Outtime[1];       for (int i = 0; i < Q; i++) {         cin >> opt;         opt -= 1;         if (opt == 0) {           cin >> node >> v;           if (Lvl[node] % 2) {             Add(Intime[node], -v);             Add(Outtime[node], v);           } else {             Add(Intime[node], v);             Add(Outtime[node], -v);           }         } else {           cin >> node;           if (Lvl[node] % 2)             cout << V[node] - Query(Intime[node]) << endl;           else             cout << V[node] + Query(Intime[node]) << endl;         }       }     }     return 0;   }   