#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
vector<int> E[maxn];
int a[maxn], l[maxn], r[maxn], dep[maxn], idx = 0;
struct node {
  int left, right, data, lazy;
} T[2][maxn << 2];
void build(int x, int l, int r, int t) {
  T[x][t].left = l;
  T[x][t].right = r;
  T[x][t].data = 0;
  T[x][t].lazy = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(x, l, mid, (t << 1));
  build(x, mid + 1, r, (t << 1) | 1);
}
void check(int x, int t) {
  if (T[x][t].lazy) {
    T[x][(t << 1)].data += T[x][t].lazy;
    T[x][(t << 1)].lazy += T[x][t].lazy;
    T[x][(t << 1) | 1].data += T[x][t].lazy;
    T[x][(t << 1) | 1].lazy += T[x][t].lazy;
    T[x][t].lazy = 0;
  }
}
void update(int x, int l, int r, int y, int t) {
  if (T[x][t].left == l && T[x][t].right == r) {
    T[x][t].data += y;
    T[x][t].lazy += y;
    return;
  }
  check(x, t);
  if (r <= T[x][(t << 1)].right) {
    update(x, l, r, y, (t << 1));
  } else if (l >= T[x][(t << 1) | 1].left) {
    update(x, l, r, y, (t << 1) | 1);
  } else {
    update(x, l, T[x][(t << 1)].right, y, (t << 1));
    update(x, T[x][(t << 1) | 1].left, r, y, (t << 1) | 1);
  }
}
int query(int x, int y, int t) {
  if (T[x][t].left == y && T[x][t].right == y) {
    return T[x][t].data;
  }
  check(x, t);
  if (y <= T[x][(t << 1)].right) {
    return query(x, y, (t << 1));
  } else {
    return query(x, y, (t << 1) | 1);
  }
}
void dfs(int x, int fa, int y) {
  l[x] = ++idx;
  dep[x] = y;
  for (int i = 0; i < E[x].size(); i++) {
    int u = E[x][i];
    if (u != fa) dfs(u, x, y ^ 1);
  }
  r[x] = idx;
}
int main() {
  int n, m, x, y, val, cmd;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    E[x].push_back(y);
    E[y].push_back(x);
  }
  dfs(1, -1, 0);
  build(0, 1, idx, 1);
  build(1, 1, idx, 1);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &cmd);
    if (cmd == 1) {
      scanf("%d%d", &x, &val);
      update(dep[x], l[x], r[x], val, 1);
      update(dep[x] ^ 1, l[x], r[x], -val, 1);
    } else {
      scanf("%d", &x);
      printf("%d\n", a[x] + query(dep[x] & 1, l[x], 1));
    }
  }
  return 0;
}
