#include <bits/stdc++.h>
using namespace std;
int mark[200100], level[200100], odd[1600100], even[1600100], lazyo[1600100],
    lazye[1600100], in[200100], out[200100], t = 0;
vector<int> g[200100];
void dfs(int pos, int lvl) {
  if (mark[pos]) return;
  mark[pos] = 1;
  t++;
  level[pos] = lvl;
  in[pos] = t;
  for (int i = 0; i < g[pos].size(); i++) {
    dfs(g[pos][i], lvl + 1);
  }
  t++;
  out[pos] = t;
}
void update(int l, int r, int ll, int rr, int val, int now) {
  if (lazyo[now] != 0) {
    odd[now] += lazyo[now] * (r - l + 1);
    if (l != r) {
      lazyo[2 * now] += lazyo[now];
      lazyo[2 * now + 1] += lazyo[now];
    }
    lazyo[now] = 0;
  }
  if (l > rr || r < ll) return;
  if (l >= ll && r <= rr) {
    odd[now] += val * (r - l + 1);
    if (l != r) {
      lazyo[2 * now] += val;
      lazyo[2 * now + 1] += val;
    }
    return;
  }
  int mid = (l + r) / 2;
  update(l, mid, ll, rr, val, 2 * now);
  update(mid + 1, r, ll, rr, val, 2 * now + 1);
  odd[now] = odd[2 * now] + odd[2 * now + 1];
  return;
}
void update2(int l, int r, int ll, int rr, int val, int now) {
  if (lazye[now] != 0) {
    even[now] += lazye[now] * (r - l + 1);
    if (l != r) {
      lazye[2 * now] += lazye[now];
      lazye[2 * now + 1] += lazye[now];
    }
    lazye[now] = 0;
  }
  if (l > rr || r < ll) return;
  if (l >= ll && r <= rr) {
    even[now] += val * (r - l + 1);
    if (l != r) {
      lazye[2 * now] += val;
      lazye[2 * now + 1] += val;
    }
    return;
  }
  int mid = (l + r) / 2;
  update2(l, mid, ll, rr, val, 2 * now);
  update2(mid + 1, r, ll, rr, val, 2 * now + 1);
  even[now] = even[2 * now] + even[2 * now + 1];
  return;
}
int qu(int l, int r, int ll, int rr, int now) {
  if (lazyo[now] != 0) {
    odd[now] += lazyo[now] * (r - l + 1);
    if (l != r) {
      lazyo[2 * now] += lazyo[now];
      lazyo[2 * now + 1] += lazyo[now];
    }
    lazyo[now] = 0;
  }
  if (l > rr || r < ll) return 0;
  if (l >= ll && r <= rr) {
    return odd[now];
  }
  int mid = (l + r) / 2, a, b;
  a = qu(l, mid, ll, rr, 2 * now);
  b = qu(mid + 1, r, ll, rr, 2 * now + 1);
  return a + b;
}
int qu2(int l, int r, int ll, int rr, int now) {
  if (lazye[now] != 0) {
    even[now] += lazye[now] * (r - l + 1);
    if (l != r) {
      lazye[2 * now] += lazye[now];
      lazye[2 * now + 1] += lazye[now];
    }
    lazye[now] = 0;
  }
  if (l > rr || r < ll) return 0;
  if (l >= ll && r <= rr) {
    return even[now];
  }
  int mid = (l + r) / 2, a, b;
  a = qu2(l, mid, ll, rr, 2 * now);
  b = qu2(mid + 1, r, ll, rr, 2 * now + 1);
  return a + b;
}
int a[200100];
int main() {
  int n, m, i, u, v, op, x, y;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 1);
  for (i = 1; i <= n; i++) {
    if (level[i] % 2 == 1) {
      update(1, t, in[i], in[i], a[i], 1);
      update(1, t, out[i], out[i], a[i], 1);
    } else {
      update2(1, t, in[i], in[i], a[i], 1);
      update2(1, t, out[i], out[i], a[i], 1);
    }
  }
  while (m--) {
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d %d", &x, &y);
      if (level[x] % 2 == 1) {
        update(1, t, in[x], out[x], y, 1);
        if (in[x] + 1 != out[x]) update2(1, t, in[x] + 1, out[x] - 1, -y, 1);
      } else {
        update2(1, t, in[x], out[x], y, 1);
        if (in[x] + 1 != out[x]) update(1, t, in[x] + 1, out[x] - 1, -y, 1);
      }
    } else {
      scanf("%d", &x);
      if (level[x] % 2 == 1) {
        printf("%d\n", qu(1, t, in[x], in[x], 1));
      } else {
        printf("%d\n", qu2(1, t, in[x], in[x], 1));
      }
    }
  }
  return 0;
}
