#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, k, w[200005], len[200005], l[200005], r[200005],
    tree[2 * 200005], p, head[200005], tim;
struct rec {
  int go, next;
} eg[2 * 200005];
void build(int a, int b) {
  p++;
  eg[p].go = b;
  eg[p].next = head[a];
  head[a] = p;
}
void dfs(int a, int b, int fa) {
  tim++;
  l[a] = tim;
  len[a] = b;
  int i = head[a];
  while (i) {
    if (eg[i].go != fa) dfs(eg[i].go, b + 1, a);
    i = eg[i].next;
  }
  tim++;
  r[a] = tim;
}
int lowbit(int i) { return i & (-i); }
void add(int a, int x) {
  while (a <= tim) {
    tree[a] += x;
    a += lowbit(a);
  }
}
int get(int i) {
  if (i == 0)
    return 0;
  else
    return tree[i] + get(i - lowbit(i));
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d%d", &x, &y);
    build(x, y);
    build(y, x);
  }
  dfs(1, 0, 0);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &k);
    if (k == 1) {
      scanf("%d%d", &x, &y);
      if (len[x] % 2 == 0) y = -y;
      add(l[x], y);
      add(r[x], -y);
    } else {
      scanf("%d", &x);
      if (len[x] % 2 == 0)
        printf("%d\n", w[x] - get(l[x]));
      else
        printf("%d\n", w[x] + get(l[x]));
    }
  }
  return 0;
}
