#include <bits/stdc++.h>
using namespace std;
vector<long long> adj[200005];
long long even[200005], eo[200005], ee[200005];
long long odd[200005], so[200005], se[200005];
long long otree[4 * 200005 + 1], etree[4 * 200005 + 1], elazy[4 * 200005 + 1],
    olazy[4 * 200005 + 1];
long long ei = 1;
long long oi = 1;
long long vis[200005], ty[200005], a[200005];
void build(long long node, long long s, long long e, long long t) {
  if (s == e) {
    if (t) {
      otree[node] = odd[s];
      return;
    } else {
      etree[node] = even[s];
      return;
    }
  }
  long long m = (s + e) / 2;
  build(2 * node, s, m, t);
  build(2 * node + 1, m + 1, e, t);
  if (t)
    otree[node] = otree[2 * node] + otree[2 * node + 1];
  else
    etree[node] = etree[2 * node] + etree[2 * node + 1];
}
void update(long long node, long long s, long long e, long long l, long long r,
            long long val, long long t) {
  if (l == 0 && r == 0) return;
  if (t && olazy[node] != 0) {
    long long ans = (e - s + 1) * olazy[node];
    if (s != e) {
      olazy[2 * node + 1] += olazy[node];
      olazy[2 * node] += olazy[node];
    }
    otree[node] += ans;
    olazy[node] = 0;
  }
  if (t == 0 && elazy[node] != 0) {
    long long ans = (e - s + 1) * elazy[node];
    if (s != e) {
      elazy[2 * node + 1] += elazy[node];
      elazy[2 * node] += elazy[node];
    }
    etree[node] += ans;
    elazy[node] = 0;
  }
  if (s > r || e < l) return;
  if (s >= l && e <= r) {
    long long ans = (e - s + 1) * val;
    if (t) {
      otree[node] += ans;
      if (s != e) {
        olazy[2 * node + 1] += val;
        olazy[2 * node] += val;
      }
    } else {
      etree[node] += ans;
      if (s != e) {
        elazy[2 * node + 1] += val;
        elazy[2 * node] += val;
      }
    }
    return;
  }
  long long m = (s + e) / 2;
  update(2 * node, s, m, l, r, val, t);
  update(2 * node + 1, m + 1, e, l, r, val, t);
  if (t)
    otree[node] = otree[2 * node + 1] + otree[2 * node];
  else
    etree[node] = etree[2 * node + 1] + etree[2 * node];
}
long long query(long long node, long long s, long long e, long long l,
                long long r, long long t) {
  if (t && olazy[node] != 0) {
    long long ans = (e - s + 1) * olazy[node];
    if (s != e) {
      olazy[2 * node + 1] += olazy[node];
      olazy[2 * node] += olazy[node];
    }
    otree[node] += ans;
    olazy[node] = 0;
  }
  if (t == 0 && elazy[node] != 0) {
    long long ans = (e - s + 1) * elazy[node];
    if (s != e) {
      elazy[2 * node + 1] += elazy[node];
      elazy[2 * node] += elazy[node];
    }
    etree[node] += ans;
    elazy[node] = 0;
  }
  if (s > r || e < l) return 0;
  if (s >= l && e <= r) {
    if (t)
      return otree[node];
    else
      return etree[node];
  }
  long long m = (s + e) / 2;
  long long p1 = query(2 * node, s, m, l, r, t);
  long long p2 = query(2 * node + 1, m + 1, e, l, r, t);
  return p1 + p2;
}
void dfs(long long x, long long t) {
  vis[x] = 1;
  bool child = true;
  for (long long i = 0; i < adj[x].size(); i++) {
    long long v = adj[x][i];
    if (!vis[v]) {
      child = false;
      break;
    }
  }
  if (t) {
    odd[oi] = a[x];
    so[x] = oi;
    if (!child)
      se[x] = ei;
    else
      se[x] = 0;
    oi++;
    ty[x] = 1;
  } else {
    even[ei] = a[x];
    se[x] = ei;
    if (!child)
      so[x] = oi;
    else
      so[x] = 0;
    ei++;
    ty[x] = 0;
  }
  for (long long i = 0; i < adj[x].size(); i++) {
    long long v = adj[x][i];
    if (!vis[v]) {
      dfs(v, abs(1 - t));
    }
  }
  if (!child) {
    eo[x] = oi - 1;
    ee[x] = ei - 1;
  } else {
    eo[x] = so[x];
    ee[x] = se[x];
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long n, m;
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) cin >> a[i];
  for (long long i = 1; i <= n - 1; i++) {
    long long x, b;
    cin >> x >> b;
    adj[x].push_back(b);
    adj[b].push_back(x);
  }
  dfs(1, 0);
  build(1, 1, n, 0);
  build(1, 1, n, 1);
  while (m--) {
    long long t;
    cin >> t;
    if (t == 1) {
      long long x, val;
      cin >> x >> val;
      if (ty[x]) {
        update(1, 1, n, so[x], eo[x], val, 1);
        update(1, 1, n, se[x], ee[x], -val, 0);
      } else {
        update(1, 1, n, se[x], ee[x], val, 0);
        update(1, 1, n, so[x], eo[x], -val, 1);
      }
    } else {
      long long x;
      cin >> x;
      if (ty[x])
        cout << query(1, 1, n, so[x], so[x], 1) << endl;
      else
        cout << query(1, 1, n, se[x], se[x], 0) << endl;
    }
  }
  return 0;
}
