#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 10;
int n, q, parent[maxN], tree[2][4 * maxN], lidx[maxN], ridx[maxN], a[maxN],
    d[maxN], num_node;
vector<int> adj[maxN];
void dfs(int u) {
  lidx[u] = ++num_node;
  for (int v : adj[u]) {
    if (v == parent[u]) continue;
    parent[v] = u;
    d[v] = 1 - d[u];
    dfs(v);
  }
  ridx[u] = num_node;
}
void lazy_update(int t, int k, int l, int r) {
  if (l == r) return;
  tree[t][k * 2] += tree[t][k];
  tree[t][k * 2 + 1] += tree[t][k];
  tree[t][k] = 0;
}
void update(int t, int k, int l, int r, int i, int j, int v) {
  if (j < l || r < i) return;
  lazy_update(t, k, l, r);
  if (i <= l && r <= j) {
    tree[t][k] += v;
    return;
  }
  int mid = (l + r) >> 1;
  update(t, k * 2, l, mid, i, j, v);
  update(t, k * 2 + 1, mid + 1, r, i, j, v);
}
int get(int t, int k, int l, int r, int i) {
  if (i < l || r < i) return 0;
  if (l == r) return tree[t][k];
  lazy_update(t, k, l, r);
  int mid = (l + r) >> 1;
  return get(t, k * 2, l, mid, i) + get(t, k * 2 + 1, mid + 1, r, i);
}
int main() {
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = 0; i < n - 1; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1);
  for (int i = 0; i < q; ++i) {
    int t, u;
    scanf("%d %d", &t, &u);
    if (t == 1) {
      int x;
      scanf("%d", &x);
      update(d[u], 1, 1, n, lidx[u], ridx[u], x);
      update(1 - d[u], 1, 1, n, lidx[u], ridx[u], -x);
    } else
      printf("%d\n", a[u] + get(d[u], 1, 1, n, lidx[u]));
  }
}
