#include <bits/stdc++.h>
using namespace std;
const long long INF = LLONG_MAX;
const long long SZ = 2e5 + 5;
const long long mod = 1e9 + 7;
long long a[SZ], st[SZ][2], en[SZ][2], tree[SZ * 4][2], lazy[SZ * 4][2], ff[SZ];
long long cnt;
vector<long long> adj[SZ];
void dfs(long long u, long long p, long long d, long long f) {
  if (d % 2 == 0)
    st[u][f] = ++cnt;
  else if (adj[u].size() > 1)
    st[u][f] = cnt + 1;
  if (d % 2 == 0) ff[u] = f;
  for (auto v : adj[u]) {
    if (v == p) continue;
    dfs(v, u, d + 1, f);
  }
  if (d % 2 == 0)
    en[u][f] = cnt;
  else if (adj[u].size() > 1)
    en[u][f] = cnt;
}
void propagate(long long node, long long r1, long long r2, long long f) {
  tree[node][f] += lazy[node][f];
  if (r1 != r2) {
    lazy[node * 2][f] += lazy[node][f];
    lazy[node * 2 + 1][f] += lazy[node][f];
  }
  lazy[node][f] = 0;
}
void update(long long node, long long r1, long long r2, long long i,
            long long j, long long v, long long f) {
  long long bam = node * 2;
  long long dan = bam + 1;
  if (r1 > j || r2 < i) return;
  if (lazy[node][f]) propagate(node, r1, r2, f);
  if (r1 >= i && r2 <= j) {
    tree[node][f] += v;
    if (r1 != r2) {
      lazy[bam][f] += v;
      lazy[dan][f] += v;
    }
    return;
  }
  long long mid = (r1 + r2) / 2;
  update(bam, r1, mid, i, j, v, f);
  update(dan, mid + 1, r2, i, j, v, f);
}
long long query(long long node, long long r1, long long r2, long long in,
                long long f) {
  long long bam = node * 2;
  long long dan = bam + 1;
  if (r1 > in || r2 < in) return 0;
  if (lazy[node][f]) propagate(node, r1, r2, f);
  if (r1 == in && r2 == in) return tree[node][f];
  long long mid = (r1 + r2) / 2;
  long long p1 = query(bam, r1, mid, in, f);
  long long p2 = query(dan, mid + 1, r2, in, f);
  return (p1 + p2);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long t = 0, n, x, y, z, i, j, k, g, p, q, ans = 0, sum = 0, c = 0;
  string s, s1, s2;
  cin >> n >> q;
  for (i = 1; i <= n; i++) cin >> a[i];
  for (i = 1; i <= n - 1; i++) {
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  adj[0].push_back(1);
  adj[1].push_back(0);
  dfs(0, -1, 0, 1);
  cnt = 0;
  dfs(1, 0, 0, 0);
  while (q--) {
    cin >> t >> p;
    if (t == 1) {
      cin >> y;
      if (ff[p]) {
        update(1, 1, n, st[p][1], en[p][1], y, 1);
        if (adj[p].size() > 1) update(1, 1, n, st[p][0], en[p][0], -y, 0);
      } else {
        update(1, 1, n, st[p][0], en[p][0], y, 0);
        if (adj[p].size() > 1) update(1, 1, n, st[p][1], en[p][1], -y, 1);
      }
    } else {
      if (ff[p])
        ans = query(1, 1, n, st[p][1], 1);
      else
        ans = query(1, 1, n, st[p][0], 0);
      cout << ans + a[p] << "\n";
    }
  }
  return 0;
}
