#include <bits/stdc++.h>
using namespace std;
struct IT {
  int c[2], lazy[2];
};
IT st[800001];
IT operator+(const IT &l, const IT &r) {
  IT kq;
  for (int i = 0; i <= 1; i++) {
    kq.c[i] = l.c[i] + r.c[i];
    kq.lazy[i] = 0;
  }
  return kq;
}
void down(int id) {
  for (int i = 0; i <= 1; i++) {
    st[id * 2].c[i] += st[id].lazy[i];
    st[id * 2].lazy[i] += st[id].lazy[i];
    st[id * 2 + 1].c[i] += st[id].lazy[i];
    st[id * 2 + 1].lazy[i] += st[id].lazy[i];
    st[id].lazy[i] = 0;
  }
}
void update(int id, int l, int r, int u, int v, int k, int ch) {
  if (u > r || v < l) return;
  if (u <= l && r <= v) {
    st[id].c[ch] += k;
    st[id].lazy[ch] += k;
    return;
  }
  down(id);
  int mid = (l + r) >> 1;
  update(id * 2, l, mid, u, v, k, ch);
  update(id * 2 + 1, mid + 1, r, u, v, k, ch);
  st[id] = st[id * 2] + st[id * 2 + 1];
}
IT get(int id, int l, int r, int u) {
  if (u < l || u > r) {
    IT kq;
    kq.c[0] = kq.c[1] = 0;
    return kq;
  }
  if (l == r) return st[id];
  down(id);
  int mid = (l + r) >> 1;
  return get(id * 2, l, mid, u) + get(id * 2 + 1, mid + 1, r, u);
}
vector<int> a[200001];
int l[200001], r[200001], h[200001], c[200001], n, m, i, u, v, k, ch;
void DFS(int u, int p) {
  l[u] = r[u] = ++n;
  h[u] = (h[p] + 1) % 2;
  for (int i = 0; i < a[u].size(); i++) {
    int v = a[u][i];
    if (v != p) {
      DFS(v, u);
      r[u] = max(r[u], r[v]);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (i = 1; i <= n; i++) cin >> c[i];
  for (i = 1; i < n; i++) {
    cin >> u >> v;
    a[u].push_back(v);
    a[v].push_back(u);
  }
  n = 0;
  DFS(1, 0);
  for (i = 1; i <= n; i++) update(1, 1, n, l[i], l[i], c[i], h[i]);
  while (m--) {
    cin >> ch;
    if (ch == 1) {
      cin >> u >> k;
      update(1, 1, n, l[u], r[u], k, h[u]);
    } else {
      cin >> u;
      IT x = get(1, 1, n, l[u]);
      cout << x.c[h[u]] - x.c[1 - h[u]] << '\n';
    }
  }
}
