#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
struct Fenwick {
  int tam;
  int bit[N];
  Fenwick() {
    tam = N;
    for (int i = 0; i <= tam; i++) {
      bit[i] = 0;
    }
  }
  Fenwick(int _n) {
    tam = _n;
    for (int i = 0; i <= tam; i++) {
      bit[i] = 0;
    }
  }
  void limp() {
    for (int s = 0; s <= tam; s++) {
      bit[s] = 0;
    }
  }
  void update(int i, int val) {
    while (i <= tam) {
      bit[i] += val;
      i += (i & (-i));
    }
  }
  int query(int i) {
    int ans = 0;
    while (i > 0) {
      ans += bit[i];
      i -= (i & (-i));
    }
    return ans;
  }
} tree1, tree2;
int n, m, v[N], inival[N], ini[N], fin[N], val[N], t = 1;
vector<int> adj[N];
bool tp[N];
void dfs(int u, int p, bool k = 0) {
  ini[u] = t++;
  tp[u] = k;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
    if (v != p) {
      dfs(v, u, !k);
    }
  }
  fin[u] = t - 1;
}
int main() {
  while (scanf("%d %d", &n, &m) != EOF) {
    for (int i = 0; i < n; i++) {
      scanf("%d", inival + i);
      adj[i].clear();
    }
    for (int i = 1; i < n; i++) {
      int a, b;
      scanf("%d %d", &a, &b);
      a--;
      b--;
      adj[a].push_back(b);
      adj[b].push_back(a);
    }
    memset(tp, 0, sizeof tp);
    t = 1;
    dfs(0, -1);
    for (int i = 0; i < n; i++) {
      v[ini[i]] = i;
    }
    for (int i = 0; i < n; i++) {
      if (tp[i] == 0) {
        tree1.update(ini[i], inival[i]);
        tree1.update(ini[i] + 1, -inival[i]);
      } else {
        tree2.update(ini[i], inival[i]);
        tree2.update(ini[i] + 1, -inival[i]);
      }
    }
    for (int i = 0; i < m; i++) {
      int q, u, value;
      scanf("%d", &q);
      if (q == 1) {
        scanf("%d %d", &u, &value);
        u--;
        if (tp[u] == 0) {
          tree1.update(ini[u], value);
          tree1.update(fin[u] + 1, -value);
          tree2.update(ini[u], -value);
          tree2.update(fin[u] + 1, value);
        } else {
          tree1.update(ini[u], -value);
          tree1.update(fin[u] + 1, value);
          tree2.update(ini[u], value);
          tree2.update(fin[u] + 1, -value);
        }
      } else {
        scanf("%d", &u);
        u--;
        if (tp[u] == 0) {
          printf("%d\n", tree1.query(ini[u]));
        } else {
          printf("%d\n", tree2.query(ini[u]));
        }
      }
    }
  }
  return 0;
}
