#include <bits/stdc++.h>
using namespace std;
const int MAXN = int(2e5) + 5;
int read() {
  int x;
  scanf("%d", &x);
  return x;
}
int n, Count[2];
int a[MAXN], level[MAXN], id[MAXN], l[2][MAXN], r[2][MAXN], it[2][MAXN * 5],
    add[2][MAXN * 5];
vector<int> adj[MAXN];
void dfs(int i, int s) {
  level[i] = s;
  id[i] = ++Count[s];
  l[s][i] = Count[s];
  l[1 - s][i] = Count[1 - s] + 1;
  for (int j = 0, sz = adj[i].size(); j < sz; ++j) {
    int u = adj[i][j];
    dfs(u, 1 - s);
  }
  r[s][i] = Count[s];
  r[1 - s][i] = Count[1 - s];
  if (r[1 - s][i] < l[1 - s][i]) l[1 - s][i] = r[1 - s][i] = 0;
}
void up(int s, int k, int k1, int k2) {
  if (add[s][k] != 0) {
    it[s][k1] += add[s][k];
    it[s][k2] += add[s][k];
    add[s][k1] += add[s][k];
    add[s][k2] += add[s][k];
    add[s][k] = 0;
  }
}
void update(int s, int k, int l, int r, int u, int v, int value) {
  if (u <= l && r <= v) {
    it[s][k] += value;
    add[s][k] += value;
    return;
  }
  int m = (l + r) / 2, k1 = k * 2, k2 = k1 + 1;
  up(s, k, k1, k2);
  if (u <= m) update(s, k1, l, m, u, min(v, m), value);
  if (v > m) update(s, k2, m + 1, r, max(u, m + 1), v, value);
}
int get(int s, int k, int l, int r, int id) {
  if (l == r) return it[s][k];
  int m = (l + r) / 2;
  up(s, k, k * 2, k * 2 + 1);
  if (id <= m)
    return get(s, k * 2, l, m, id);
  else
    return get(s, k * 2 + 1, m + 1, r, id);
}
int main() {
  n = read();
  int m = read();
  for (int i = 1; i <= n; ++i) a[i] = read();
  for (int i = 1; i < n; ++i) {
    int x, y;
    x = read();
    y = read();
    adj[x].push_back(y);
  }
  dfs(1, 0);
  for (int i = 1; i <= m; ++i) {
    int t = read();
    int u = read();
    if (t == 1) {
      int v = read();
      update(level[u], 1, 1, n, l[level[u]][u], r[level[u]][u], v);
      if (l[1 - level[u]][u] != 0)
        update(1 - level[u], 1, 1, n, l[1 - level[u]][u], r[1 - level[u]][u],
               -v);
    } else
      printf("%d\n", a[u] + get(level[u], 1, 1, n, id[u]));
  }
  return 0;
}
