#include <bits/stdc++.h>
using namespace std;
vector<int> v[200005];
int tree[4 * 200005], n, m, a[200005], pos[200005], sz[200005], dep[200005],
    cnt;
int dfsorder(int i, int d) {
  dep[i] = d;
  pos[i] = cnt++;
  int s = 1;
  for (int j = 0; j < v[i].size(); j++)
    if (pos[v[i][j]] == 0) s += dfsorder(v[i][j], d + 1);
  sz[i] = s;
  return s;
}
void lup(int i, int j, int node) {
  if (tree[node]) {
    if (i != j) {
      tree[node * 2] += tree[node];
      tree[node * 2 + 1] += tree[node];
      tree[node] = 0;
    }
  }
}
void update(int i, int j, int l, int r, int node, int val) {
  if (i > j || i > r || j < l) return;
  lup(i, j, node);
  if (i >= l && j <= r) {
    if (i == j) {
      tree[node] += val;
    } else {
      tree[node * 2] += val;
      tree[node * 2 + 1] += val;
    }
    return;
  }
  int le = node << 1, mid = (i + j) >> 1;
  update(i, mid, l, r, le, val);
  update(mid + 1, j, l, r, le + 1, val);
}
int query(int i, int j, int node, int v) {
  if (i > j || i > v || j < v) return 0;
  lup(i, j, node);
  if (i == j) return tree[node];
  int q1, q2, mid = (i + j) >> 1, le = node << 1;
  q1 = query(i, mid, le, v);
  q2 = query(mid + 1, j, le + 1, v);
  return q1 + q2;
}
int main() {
  cnt = 1;
  int dir, x, val, y;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfsorder(1, 1);
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &dir, &x);
    if (dir == 1) {
      scanf("%d", &val);
      if (dep[x] & 1) val *= -1;
      update(1, n, pos[x], pos[x] + sz[x] - 1, 1, val);
    } else {
      int val = query(1, n, 1, pos[x]);
      if (dep[x] & 1) val *= -1;
      printf("%d\n", val + a[x]);
    }
  }
}
