#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m;
struct FWT {
  int s[N];
  void update(int x, int w) {
    for (; x <= n; x += x & -x) s[x] += w;
  }
  int query(int x) {
    int res = 0;
    for (; x; x -= x & -x) res += s[x];
    return res;
  }
} T[2];
int s[N], t[N], dep[N], dfn;
int head[N];
struct Edge {
  int v, nxt;
} e[N << 1];
int tot;
void add(int u, int v) {
  e[++tot] = {v, head[u]};
  head[u] = tot;
}
int a[N];
void dfs(int u, int fa) {
  s[u] = ++dfn;
  dep[u] = dep[fa] + 1;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v == fa) continue;
    dfs(v, u);
  }
  t[u] = dfn;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    add(u, v), add(v, u);
  }
  dfs(1, 0);
  for (int i = 1; i <= m; ++i) {
    int op, x, v;
    cin >> op >> x;
    if (op == 1) {
      cin >> v;
      int k = dep[x] % 2;
      T[k].update(s[x], v), T[k].update(t[x] + 1, -v);
      k ^= 1;
      T[k].update(s[x], -v), T[k].update(t[x] + 1, v);
    } else {
      int k = dep[x] % 2;
      cout << a[x] + T[k].query(s[x]) << '\n';
    }
  }
  return 0;
}
