#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0;
  int f = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return x = f ? -x : x;
}
inline void write(long long x) {
  if (x == 0) {
    putchar('0'), putchar('\n');
    return;
  }
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  static char s[23];
  int l = 0;
  while (x != 0) s[l++] = x % 10 + 48, x /= 10;
  while (l) putchar(s[--l]);
  putchar('\n');
}
const int MXN = 3e5 + 5;
const int MXE = 4e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m;
std::vector<int> mp[MXN];
int ar[MXN << 2];
int rid[MXN], tot = 0, siz[MXN], dep[MXN], rtid[MXN];
void dfs(int u, int ba, int d) {
  rid[u] = ++tot;
  siz[u] = 1;
  dep[u] = d;
  rtid[tot] = u;
  for (auto v : mp[u]) {
    if (v == ba) continue;
    dfs(v, u, d + 1);
    siz[u] += siz[v];
  }
}
struct segTree {
  int sum[MXN << 2], flag[MXN << 2];
  void push_down(int l, int mid, int r, int rt) {
    if (flag[rt] == 0) return;
    flag[rt << 1] += flag[rt];
    flag[rt << 1 | 1] += flag[rt];
    sum[rt << 1] += flag[rt] * (mid - l + 1);
    sum[rt << 1 | 1] += flag[rt] * (r - mid);
    flag[rt] = 0;
  }
  void update(int L, int R, int l, int r, int rt, int val) {
    if (L <= l && r <= R) {
      sum[rt] += val * (r - l + 1);
      flag[rt] += val;
      return;
    }
    int mid = (l + r) >> 1;
    push_down(l, mid, r, rt);
    if (L > mid)
      update(L, R, mid + 1, r, rt << 1 | 1, val);
    else if (R <= mid)
      update(L, R, l, mid, rt << 1, val);
    else {
      update(L, mid, l, mid, rt << 1, val);
      update(mid + 1, R, mid + 1, r, rt << 1 | 1, val);
    }
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
  }
  int query(int p, int l, int r, int rt) {
    if (l == r) {
      return sum[rt];
    }
    int mid = (l + r) >> 1;
    push_down(l, mid, r, rt);
    if (p <= mid)
      return query(p, l, mid, rt << 1);
    else
      return query(p, mid + 1, r, rt << 1 | 1);
  }
  void init(int l, int r, int rt) {
    flag[rt] = 0;
    if (l == r) {
      sum[rt] = ar[rtid[l]];
      return;
    }
    int mid = (l + r) >> 1;
    init(l, mid, rt << 1);
    init(mid + 1, r, rt << 1 | 1);
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
  }
} seg1, seg2;
int main() {
  n = read(), m = read();
  for (int i = 1; i <= n; ++i) ar[i] = read();
  for (int i = 1, a, b; i < n; ++i) {
    a = read(), b = read();
    mp[a].push_back(b);
    mp[b].push_back(a);
  }
  dfs(1, 0, 1);
  seg1.init(1, n, 1);
  seg2.init(1, n, 1);
  int opt, x, val;
  while (m--) {
    opt = read();
    if (opt == 1) {
      x = read(), val = read();
      if (dep[x] & 1) {
        seg1.update(rid[x], rid[x] + siz[x] - 1, 1, n, 1, val);
        seg2.update(rid[x], rid[x] + siz[x] - 1, 1, n, 1, -val);
      } else {
        seg2.update(rid[x], rid[x] + siz[x] - 1, 1, n, 1, val);
        seg1.update(rid[x], rid[x] + siz[x] - 1, 1, n, 1, -val);
      }
    } else {
      x = read();
      if (dep[x] & 1) {
        printf("%d\n", seg1.query(rid[x], 1, n, 1));
      } else {
        printf("%d\n", seg2.query(rid[x], 1, n, 1));
      }
    }
  }
  return 0;
}
