#include <bits/stdc++.h>
using namespace std;
const long long sz = 2e5 + 10;
long long ara[sz], tim, start[sz], stop[sz], lvl[sz];
vector<long long> g[sz];
void dfs(long long u, long long p) {
  start[u] = ++tim, lvl[u] = lvl[p] + 1;
  for (long long &v : g[u]) {
    if (v == p) continue;
    dfs(v, u);
  }
  stop[u] = tim;
}
struct Seg {
  long long tree[4 * sz], lazy[4 * sz];
  void prop(long long lo, long long hi, long long node) {
    if (lo == hi) return;
    tree[node << 1] += lazy[node];
    tree[node << 1 | 1] += lazy[node];
    lazy[node << 1] += lazy[node];
    lazy[node << 1 | 1] += lazy[node];
    lazy[node] = 0;
  }
  void update(long long lo, long long hi, long long l, long long r, long long v,
              long long node) {
    if (lazy[node]) prop(lo, hi, node);
    if (lo > r || hi < l) return;
    if (lo >= l && hi <= r) {
      tree[node] += v;
      lazy[node] += v;
      return;
    }
    long long mid = (lo + hi) >> 1;
    update(lo, mid, l, r, v, node << 1);
    update(mid + 1, hi, l, r, v, node << 1 | 1);
  }
  long long query(long long lo, long long hi, long long idx, long long node) {
    if (lazy[node]) prop(lo, hi, node);
    if (lo > idx || hi < idx) return 0;
    if (lo == hi) return tree[node];
    long long mid = (lo + hi) >> 1;
    return query(lo, mid, idx, node << 1) +
           query(mid + 1, hi, idx, node << 1 | 1);
  }
} segOdd, segEven;
int main() {
  long long n, m;
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) scanf("%lld", &ara[i]);
  for (long long i = 1; 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);
  while (m--) {
    long long op, x, val;
    scanf("%lld", &op);
    if (op == 1) {
      scanf("%lld", &x), scanf("%lld", &val);
      if (lvl[x] & 1)
        segOdd.update(1, tim, start[x], stop[x], val, 1);
      else
        segEven.update(1, tim, start[x], stop[x], val, 1);
    } else {
      scanf("%lld", &x);
      long long odd = segOdd.query(1, tim, start[x], 1);
      long long even = segEven.query(1, tim, start[x], 1);
      long long ans = ara[x];
      if (lvl[x] & 1)
        ans = ans + odd - even;
      else
        ans = ans + even - odd;
      printf("%lld\n", ans);
    }
  }
  return 0;
}
