#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const int M = 128;
const int inf = 0x7fffffff;
const long long INF = 9E18;
const int mod = 1e9 + 7;
int tree[maxn << 2][2], a[maxn];
int in[maxn], out[maxn], dis[maxn];
int dfs_clock = 0;
vector<int> g[maxn];
void dfs(int u, int fa) {
  dis[u] = dis[fa] ^ 1;
  in[u] = ++dfs_clock;
  for (int i = 0; i < g[u].size(); i++) {
    int to = g[u][i];
    if (to == fa) continue;
    dfs(to, u);
  }
  out[u] = dfs_clock;
}
void pushdown(int rt, int odd) {
  if (tree[rt][odd]) {
    tree[rt << 1 | 1][odd] += tree[rt][odd];
    tree[rt << 1][odd] += tree[rt][odd];
    tree[rt][odd] = 0;
  }
}
void update(int x, int y, int l, int r, int val, int odd, int rt) {
  if (x <= l && r <= y) {
    tree[rt][odd] += val;
    return;
  }
  pushdown(rt, odd);
  int mid = (l + r) >> 1;
  if (x <= mid) update(x, y, l, mid, val, odd, rt << 1);
  if (y > mid) update(x, y, mid + 1, r, val, odd, rt << 1 | 1);
}
int query(int p, int l, int r, int rt, int odd) {
  if (l == r) {
    return tree[rt][odd];
  }
  pushdown(rt, odd);
  int mid = (l + r) >> 1;
  if (p <= mid)
    return query(p, l, mid, rt << 1, odd);
  else
    return query(p, mid + 1, r, rt << 1 | 1, odd);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dis[0] = 0;
  dfs(1, 0);
  for (int i = 0; i < m; i++) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int x, val;
      scanf("%d%d", &x, &val);
      update(in[x], out[x], 1, n, val, dis[x], 1);
      update(in[x], out[x], 1, n, -val, dis[x] ^ 1, 1);
    } else {
      int num;
      scanf("%d", &num);
      cout << query(in[num], 1, n, 1, dis[num]) + a[num] << '\n';
    }
  }
  return 0;
}
