#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
struct edge {
  long long u, v;
  long long nxt;
} e[200005 * 3];
long long visit[200005 * 3], cnt;
long long s[200005];
long long mark[200005];
long long le[200005], ri[200005];
long long wtf;
void addedge(long long u, long long v) {
  e[cnt].u = u;
  e[cnt].v = v;
  e[cnt].nxt = visit[u];
  visit[u] = cnt++;
}
void dfs(long long x) {
  le[x] = wtf++;
  for (long long i = visit[x]; i != -1; i = e[i].nxt) {
    if (mark[e[i].v] != -1) continue;
    mark[e[i].v] = (mark[x] + 1) % 2;
    dfs(e[i].v);
  }
  ri[x] = wtf++;
}
struct st {
  long long l, r;
  long long cnt[2];
} t[200005 * 8];
void build(long long n, long long l, long long r) {
  t[n].l = l;
  t[n].r = r;
  t[n].cnt[0] = t[n].cnt[1] = 0;
  if (l == r) return;
  long long mid = (l + r) >> 1;
  build(n << 1, l, mid);
  build(n << 1 | 1, mid + 1, r);
}
void dowm(long long n) {
  t[n << 1].cnt[0] += t[n].cnt[0];
  t[n << 1].cnt[1] += t[n].cnt[1];
  t[n << 1 | 1].cnt[0] += t[n].cnt[0];
  t[n << 1 | 1].cnt[1] += t[n].cnt[1];
  t[n].cnt[0] = t[n].cnt[1] = 0;
}
void add(long long n, long long l, long long r, long long v, long long op) {
  if (t[n].l >= l && t[n].r <= r) {
    t[n].cnt[op] += v;
    return;
  }
  dowm(n);
  long long mid = (t[n].l + t[n].r) >> 1;
  if (l <= mid) add(n << 1, l, r, v, op);
  if (r > mid) add(n << 1 | 1, l, r, v, op);
}
long long query(long long n, long long x, long long op) {
  if (t[n].l == x && t[n].r == x) {
    if (op == 1)
      return t[n].cnt[1] - t[n].cnt[0];
    else
      return t[n].cnt[0] - t[n].cnt[1];
  }
  long long mid = (t[n].l + t[n].r) >> 1;
  dowm(n);
  if (x <= mid)
    return query(n << 1, x, op);
  else
    return query(n << 1 | 1, x, op);
}
int main() {
  long long i, j, k, l;
  long long n, m;
  while (cin >> n >> m) {
    memset(visit, -1, sizeof(visit));
    cnt = 0;
    for (i = 1; i <= n; i++) {
      cin >> s[i];
    }
    for (i = 1; i < n; i++) {
      cin >> j >> k;
      addedge(j, k);
    }
    memset(mark, -1, sizeof(mark));
    mark[1] = 1;
    wtf = 1;
    dfs(1);
    build(1, 1, n * 2);
    for (i = 1; i <= m; i++) {
      long long op;
      cin >> op;
      if (op == 1) {
        cin >> j >> k;
        add(1, le[j], ri[j], k, mark[j]);
      } else {
        cin >> j;
        cout << query(1, le[j], mark[j]) + s[j] << endl;
      }
    }
  }
  return 0;
}
