#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 * 1000 + 10;
vector<int> vec[MAXN];
bool mark[MAXN], h[MAXN];
int st[MAXN], fi[MAXN], arr[MAXN], seg[4 * MAXN];
int t = 0;
void dfs(int v) {
  mark[v] = true;
  st[v] = t;
  t++;
  for (int i = 0; i < (int)vec[v].size(); i++)
    if (!mark[vec[v][i]]) {
      h[vec[v][i]] = 1 - h[v];
      dfs(vec[v][i]);
    }
  fi[v] = t;
}
void upd(int l, int r, int val, int v, int s, int e) {
  if (e - s <= 1 || (l <= s && e <= r)) {
    seg[v] += val;
    return;
  }
  int m = (s + e) / 2;
  if (r <= m) {
    upd(l, r, val, v * 2, s, m);
    return;
  }
  if (m <= l) {
    upd(l, r, val, v * 2 + 1, m, e);
    return;
  }
  upd(l, r, val, v * 2, s, m);
  upd(l, r, val, v * 2 + 1, m, e);
  return;
}
int find(int p, int v, int s, int e) {
  if (e - s <= 1) return seg[v];
  int m = (s + e) / 2;
  if (p < m)
    return find(p, v * 2, s, m) + seg[v];
  else
    return find(p, v * 2 + 1, m, e) + seg[v];
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d", arr + i);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    vec[a].push_back(b);
    vec[b].push_back(a);
  }
  dfs(0);
  for (int i = 0; i < m; i++) {
    int type, x;
    scanf("%d %d", &type, &x);
    x--;
    if (type == 1) {
      int val;
      scanf("%d", &val);
      upd(st[x], fi[x], (h[x] == 1) ? val : -val, 1, 0, n);
    } else
      printf("%d\n", arr[x] + find(st[x], 1, 0, n) * ((h[x] == 1) ? 1 : -1));
  }
}
