#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
vector<int> v[maxn];
int s[maxn], e[maxn];
int lz[2][maxn << 2], t[2][maxn << 2];
int n, q, tot;
int a[maxn];
int de[maxn];
int id[maxn];
void dfs(int x, int fa) {
  s[x] = ++tot;
  id[tot] = x;
  de[x] = de[fa] + 1;
  for (int i : v[x]) {
    if (i == fa) continue;
    dfs(i, x);
  }
  e[x] = tot;
}
void pushdown(int k, int now, int l, int r) {
  if (!lz[k][now]) return;
  lz[k][now << 1] += lz[k][now];
  lz[k][now << 1 | 1] += lz[k][now];
  lz[k][now] = 0;
}
void update(int k, int now, int l, int r, int L, int R, int val) {
  if (L > R) return;
  if (l == L && r == R) {
    lz[k][now] += val;
    return;
  }
  pushdown(k, now, l, r);
  update(k, now << 1, l, ((l + r) >> 1), L, min(((l + r) >> 1), R), val);
  update(k, now << 1 | 1, ((l + r) >> 1) + 1, r, max(((l + r) >> 1) + 1, L), R,
         val);
}
int quary(int k, int now, int l, int r, int pos) {
  if (l == r) return a[id[l]] + lz[k][now];
  pushdown(k, now, l, r);
  if (pos <= ((l + r) >> 1))
    return quary(k, now << 1, l, ((l + r) >> 1), pos);
  else
    return quary(k, now << 1 | 1, ((l + r) >> 1) + 1, r, pos);
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1, x, y; i < n; i++) {
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1, 0);
  for (int i = 1, k, x, y; i <= q; i++) {
    scanf("%d", &k);
    if (k == 1) {
      scanf("%d%d", &x, &y);
      if (de[x] & 1)
        update(1, 1, 1, n, s[x], e[x], y), update(0, 1, 1, n, s[x], e[x], -y);
      else
        update(1, 1, 1, n, s[x], e[x], -y), update(0, 1, 1, n, s[x], e[x], y);
    } else {
      scanf("%d", &x);
      printf("%d\n", quary(de[x] & 1, 1, 1, n, s[x]));
    }
  }
  return 0;
}
