#include <bits/stdc++.h>
using namespace std;
struct range {
  int el, ol, er, orr;
} rg[200010];
vector<int> adj[200010];
int arr[200010];
int lvl[200010];
int even[4 * 200010], odd[4 * 100010], elazy[4 * 200010], olazy[4 * 200010];
int ogl, egl;
void explore(int root, int p, int level) {
  lvl[root] = level;
  if (level & 1) {
    rg[root].ol = ogl++;
    rg[root].el = egl;
    for (int& x : adj[root])
      if (x != p) explore(x, root, level + 1);
    rg[root].orr = ogl - 1;
    rg[root].er = egl - 1;
  } else {
    rg[root].ol = ogl;
    rg[root].el = egl++;
    for (int& x : adj[root])
      if (x != p) explore(x, root, level + 1);
    rg[root].orr = ogl - 1;
    rg[root].er = egl - 1;
  }
}
void push_lazy(int* tree, int* lazy, int root) {
  if (lazy[root] != 0) {
    tree[root] += lazy[root];
    lazy[root * 2 + 1] += lazy[root];
    lazy[root * 2 + 2] += lazy[root];
    lazy[root] = 0;
  }
}
int query_tree(int* tree, int* lazy, int root, int b, int e, int l, int r) {
  if (b != e)
    push_lazy(tree, lazy, root);
  else {
    tree[root] += lazy[root];
    lazy[root] = 0;
  }
  if (r < b || l > e) return 0;
  if (l <= b && e <= r) return tree[root];
  int mid = (b + e) / 2, lc = root * 2 + 1, rc = root * 2 + 2;
  return query_tree(tree, lazy, lc, b, mid, l, r) +
         query_tree(tree, lazy, rc, mid + 1, e, l, r);
}
void update_tree(int* tree, int* lazy, int root, int b, int e, int l, int r,
                 int val) {
  if (b != e)
    push_lazy(tree, lazy, root);
  else {
    tree[root] += lazy[root];
    lazy[root] = 0;
  }
  if (r < b || l > e) return;
  if (l <= b && e <= r) {
    lazy[root] += val;
    return;
  }
  int mid = (b + e) / 2, lc = root * 2 + 1, rc = root * 2 + 2;
  update_tree(tree, lazy, lc, b, mid, l, r, val);
  update_tree(tree, lazy, rc, mid + 1, e, l, r, val);
}
void update(int xx, int val) {
  int oddval = val, evenval = val;
  if (lvl[xx] & 1)
    evenval = -val;
  else
    oddval = -val;
  if (rg[xx].el <= rg[xx].er) {
    update_tree(even, elazy, 0, 0, egl - 1, rg[xx].el, rg[xx].er, evenval);
  }
  if (rg[xx].ol <= rg[xx].orr) {
    update_tree(odd, olazy, 0, 0, ogl - 1, rg[xx].ol, rg[xx].orr, oddval);
  }
}
int query(int node) {
  if (lvl[node] & 1) {
    return query_tree(odd, olazy, 0, 0, ogl - 1, rg[node].ol, rg[node].ol);
  } else
    return query_tree(even, elazy, 0, 0, egl - 1, rg[node].el, rg[node].el);
}
int main() {
  std::ios::sync_with_stdio(false);
  int n, m;
  int v, u;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> arr[i];
  }
  for (int i = 0; i < n - 1; i++) {
    cin >> v >> u;
    adj[v].push_back(u);
    adj[u].push_back(v);
  }
  explore(1, -1, 0);
  int x, val;
  for (int i = 0; i < m; i++) {
    cin >> x >> v;
    if (x == 1) {
      cin >> val;
      update(v, val);
    } else {
      cout << arr[v] + query(v) << '\n';
    }
  }
  return 0;
}
