#include <bits/stdc++.h>
using namespace std;
const int Mod = 1000000007;
struct node {
  int l, r;
};
int tr[200005 << 2], lazy[200005 << 2];
void Build(int l, int r, int rt) {
  tr[rt] = 0;
  lazy[rt] = 0;
  if (l == r) return;
  int mid = l + r >> 1;
  Build(l, mid, rt << 1);
  Build(mid + 1, r, rt << 1 | 1);
}
void up(int rt) { tr[rt] = tr[rt << 1] + tr[rt << 1 | 1]; }
void down(int l, int r, int rt) {
  if (!lazy[rt]) return;
  int mid = l + r >> 1;
  lazy[rt << 1] += lazy[rt];
  lazy[rt << 1 | 1] += lazy[rt];
  tr[rt << 1] += lazy[rt] * (mid - l + 1);
  tr[rt << 1 | 1] += lazy[rt] * (r - mid);
  lazy[rt] = 0;
}
void Change(int L, int R, int val, int l, int r, int rt) {
  if (L <= l && r <= R) {
    tr[rt] += val * (r - l + 1);
    lazy[rt] += val;
    return;
  }
  int mid = l + r >> 1;
  down(l, r, rt);
  if (R <= mid)
    Change(L, R, val, l, mid, rt << 1);
  else if (L > mid)
    Change(L, R, val, mid + 1, r, rt << 1 | 1);
  else
    Change(L, mid, val, l, mid, rt << 1),
        Change(mid + 1, R, val, mid + 1, r, rt << 1 | 1);
  up(rt);
}
int query(int x, int l, int r, int rt) {
  if (l == r) return tr[rt];
  int mid = l + r >> 1;
  down(l, r, rt);
  if (x <= mid)
    return query(x, l, mid, rt << 1);
  else
    return query(x, mid + 1, r, rt << 1 | 1);
}
node nd[200005];
int rt = 0, n, m, u, v;
vector<int> g[200005];
int dep[200005];
int a[200005];
void dfs(int now, int fa) {
  rt++;
  nd[now].l = rt;
  for (int i = 1; i <= g[now].size(); i++) {
    v = g[now][i - 1];
    if (v == fa) continue;
    dep[v] = dep[now] + 1;
    dfs(v, now);
  }
  nd[now].r = rt;
}
int Ans(int x) {
  int val = query(nd[x].l, 1, n, 1);
  if (dep[x] % 2)
    return a[x] - val;
  else
    return a[x] + val;
}
void Modfy(int x, int val) {
  if (dep[x] % 2) val = -val;
  Change(nd[x].l, nd[x].r, val, 1, n, 1);
}
void solve() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) g[i].clear();
  for (int i = 1; i <= n - 1; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  Build(1, n, 1);
  dep[1] = 0;
  dfs(1, 1);
  while (m--) {
    cin >> u;
    if (u == 2) {
      cin >> v;
      cout << Ans(v) << endl;
    } else {
      cin >> u >> v;
      Modfy(u, v);
    }
  }
}
int main() {
  int t = 1;
  for (int i = 1; i <= t; i++) solve();
  return 0;
}
