#include <bits/stdc++.h>
using namespace std;
const long long lim = 2e5 + 10;
long long a[lim], s[lim], e[lim], lvl[lim];
vector<long long> g[lim];
struct info {
  bool lazy;
  long long osum, esum;
} t[lim * 4];
void update(long long nd, long long a, long long b, long long i, long long j,
            long long o, long long e) {
  if (b < i || a > j) return;
  if (i <= a && b <= j) {
    t[nd].lazy = true;
    t[nd].osum += o;
    t[nd].esum += e;
    return;
  }
  long long l = nd * 2, r = l + 1, m = (a + b) / 2;
  if (t[nd].lazy) {
    t[l].lazy = t[r].lazy = true;
    t[nd].lazy = false;
    t[l].osum += t[nd].osum;
    t[l].esum += t[nd].esum;
    t[r].osum += t[nd].osum;
    t[r].esum += t[nd].esum;
    t[nd].osum = t[nd].esum = 0;
  }
  update(l, a, m, i, j, o, e);
  update(r, m + 1, b, i, j, o, e);
}
long long query(long long nd, long long a, long long b, long long i) {
  if (b < i || a > i) return 0;
  if (a == b) {
    if (lvl[a] == 1)
      return t[nd].osum;
    else
      return t[nd].esum;
  }
  long long l = nd * 2, r = l + 1, m = (a + b) / 2;
  if (t[nd].lazy) {
    t[l].lazy = t[r].lazy = true;
    t[nd].lazy = false;
    t[l].osum += t[nd].osum;
    t[l].esum += t[nd].esum;
    t[r].osum += t[nd].osum;
    t[r].esum += t[nd].esum;
    t[nd].osum = t[nd].esum = 0;
  }
  return query(l, a, m, i) + query(r, m + 1, b, i);
}
long long Clock;
void dfs(long long r, long long p, long long l) {
  ++Clock;
  s[r] = Clock;
  lvl[Clock] = l;
  for (long long i = 0; i < g[r].size(); i++) {
    long long v = g[r][i];
    if (p == v) continue;
    dfs(v, r, l ^ 1);
  }
  e[r] = Clock;
}
int main() {
  long long n, m;
  scanf("%lld", &n);
  scanf("%lld", &m);
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (long long i = 2; i <= n; i++) {
    long long u, v;
    scanf("%lld", &u);
    scanf("%lld", &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 0, 1);
  while (m--) {
    long long type;
    scanf("%lld", &type);
    if (type == 1) {
      long long x, val;
      scanf("%lld", &x);
      scanf("%lld", &val);
      if (lvl[s[x]] == 1) {
        update(1, 1, n, s[x], e[x], val, -val);
      } else
        update(1, 1, n, s[x], e[x], -val, val);
    } else {
      long long x;
      scanf("%lld", &x);
      long long ans = a[x] + query(1, 1, n, s[x]);
      printf("%lld\n", ans);
    }
  }
  return 0;
}
