#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010, maxm = 2 * maxn;
int n, m, a[maxn], L[maxn], R[maxn], dn, dep[maxn];
struct edge {
  int j, d;
  edge *nx;
} e[maxm], *v[maxn];
int en;
inline void add_e(int i, int j, int d) {
  e[++en].nx = v[i];
  v[i] = e + en;
  v[i]->j = j;
  v[i]->d = d;
}
struct vt {
  int l, r, k, mk;
  vt *c[2];
} * rt;
struct LineTree {
  inline vt *nw(int l, int r) {
    vt *x = new vt;
    x->l = l;
    x->r = r;
    x->k = x->mk = 0;
    x->c[0] = x->c[1] = 0;
    return x;
  }
  void build(vt *x) {
    int mid = (x->l + x->r) >> 1;
    x->c[0] = nw(x->l, mid);
    x->c[1] = nw(mid + 1, x->r);
  }
  inline void clr(int l, int r) { rt = nw(l, r); }
  inline void mark(vt *x, int k) {
    x->mk += k;
    x->k += (x->r - x->l + 1) * k;
  }
  inline void push(vt *x) {
    if (!x->mk) return;
    mark(x->c[0], x->mk);
    mark(x->c[1], x->mk);
    x->mk = 0;
  }
  inline void upd(vt *x) { x->k = x->c[0]->k + x->c[1]->k; }
  int get(vt *x, int l, int r) {
    if (l > x->r || r < x->l) return 0;
    if (l <= x->l && x->r <= r) return x->k;
    if (!x->c[0]) build(x);
    push(x);
    return get(x->c[0], l, r) + get(x->c[1], l, r);
  }
  void add(vt *x, int l, int r, int k) {
    if (l > x->r || r < x->l) return;
    if (l <= x->l && x->r <= r) {
      mark(x, k);
      return;
    }
    if (!x->c[0]) build(x);
    push(x);
    add(x->c[0], l, r, k);
    add(x->c[1], l, r, k);
    upd(x);
  }
} lt;
void dfs(int i, int p, int d) {
  dep[i] = d;
  L[i] = ++dn;
  for (edge *e = v[i]; e; e = e->nx)
    if (e->j != p) dfs(e->j, i, d + 1);
  R[i] = dn;
}
int main() {
  int i, j, k, t, ii, jj, kk, tt;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%d", a + i);
  for (k = 1; k < n; k++) {
    scanf("%d%d", &i, &j);
    add_e(i, j, 0);
    add_e(j, i, 0);
  }
  lt.clr(1, n);
  dn = 0;
  dfs(1, 0, 0);
  for (i = 1; i <= n; i++) {
    if (dep[i] & 1) a[i] = -a[i];
    lt.add(rt, L[i], L[i], a[i]);
  }
  while (m--) {
    scanf("%d", &k);
    if (k == 1) {
      scanf("%d%d", &i, &j);
      if (dep[i] & 1) j = -j;
      lt.add(rt, L[i], R[i], j);
    } else {
      scanf("%d", &i);
      t = lt.get(rt, L[i], L[i]);
      if (dep[i] & 1) t = -t;
      printf("%d\n", t);
    }
  }
  return 0;
}
