#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
vector<int> edge[maxn];
int n, m, c, x, y, cnt, val[maxn], value[2][maxn], tot[2], v[2][maxn],
    deep[maxn], in[maxn], out[maxn], lazy[2][maxn * 4];
void dfs(int x, int pre) {
  deep[x] = deep[pre] + 1;
  in[x] = ++cnt;
  v[deep[x] % 2][in[x]] = x;
  for (int i = 0; i < edge[x].size(); i++)
    if (edge[x][i] != pre) dfs(edge[x][i], x);
  out[x] = cnt;
}
void build(int z, int o, int l, int r) {
  if (l == r) {
    if (v[z][l]) {
      value[z][l] = val[v[z][l]];
    } else
      value[z][l] = 2100000000;
    return;
  }
  int mid = (l + r) / 2;
  build(z, (o << 1), l, mid);
  build(z, ((o << 1) | 1), mid + 1, r);
}
void pushdown(int z, int o, int l, int r) {
  if (!lazy[z][o]) return;
  if (l == r) {
    if (value[z][l] != 2100000000) value[z][l] += lazy[z][o];
  } else {
    lazy[z][(o << 1)] += lazy[z][o];
    lazy[z][((o << 1) | 1)] += lazy[z][o];
  }
  lazy[z][o] = 0;
}
void addtree(int z, int o, int l, int r, int L, int R, int c) {
  pushdown(z, o, l, r);
  if (l > R || r < L) return;
  if (l >= L && r <= R) {
    lazy[z][o] += c;
    return;
  }
  int mid = (l + r) / 2;
  addtree(z, (o << 1), l, mid, L, R, c);
  addtree(z, ((o << 1) | 1), mid + 1, r, L, R, c);
}
int query(int z, int o, int l, int r, int L, int R) {
  pushdown(z, o, l, r);
  if (l > R || r < L) return 0;
  if (l == r) {
    if (value[z][l] == 2100000000) return 0;
    return value[z][l];
  }
  int mid = (l + r) / 2;
  return query(z, (o << 1), l, mid, L, R) +
         query(z, ((o << 1) | 1), mid + 1, r, L, R);
}
int main(void) {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    edge[x].push_back(y);
    edge[y].push_back(x);
  }
  dfs(1, 0);
  build(0, 1, 1, n);
  build(1, 1, 1, n);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &c);
    if (c == 1) {
      scanf("%d%d", &x, &y);
      addtree(deep[x] % 2, 1, 1, n, in[x], out[x], y);
      addtree(!(deep[x] % 2), 1, 1, n, in[x], out[x], -y);
    } else {
      scanf("%d", &x);
      printf("%d\n", query(deep[x] % 2, 1, 1, n, in[x], in[x]) +
                         query(!(deep[x] % 2), 1, 1, n, in[x], in[x]));
    }
  }
  return 0;
}
