#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
struct node {
  int val, lazy;
  node() { lazy = 0; }
};
node tree0[4 * N], tree1[4 * N];
int sw[N];
int a[N];
vector<int> ord;
int st[N], en[N];
vector<int> g[N];
node merge(node x, node y) {
  node ret;
  ret.val = x.val + y.val;
  ret.lazy = 0;
  return ret;
}
void dfs(int v, int p) {
  ord.push_back(a[v]);
  st[v] = ord.size() - 1;
  for (auto u : g[v])
    if (u != p) {
      sw[u] = 1 - sw[v];
      dfs(u, v);
    }
  en[v] = ord.size() - 1;
}
void build(int h, int s, int e, node tree[]) {
  if (s == e) {
    tree[h].val = ord[s];
    tree[h].lazy = 0;
    return;
  }
  int m = (s + e) >> 1;
  build(h << 1, s, m, tree);
  build((h << 1) | 1, m + 1, e, tree);
  tree[h] = merge(tree[h << 1], tree[h << 1 | 1]);
}
void upd(int h, int s, int e, int l, int r, int x, node tree[]) {
  if (s > e || r < s || l > e) return;
  if (tree[h].lazy) {
    tree[h].val += (e - s + 1) * tree[h].lazy;
    if (s != e) {
      tree[h << 1].lazy += tree[h].lazy;
      tree[h << 1 | 1].lazy += tree[h].lazy;
    }
    tree[h].lazy = 0;
  }
  if (l <= s && r >= e) {
    tree[h].val += (e - s + 1) * x;
    if (s != e) {
      tree[h << 1].lazy += x;
      tree[h << 1 | 1].lazy += x;
    }
    return;
  }
  int m = (s + e) >> 1;
  upd(h << 1, s, m, l, r, x, tree);
  upd(h << 1 | 1, m + 1, e, l, r, x, tree);
}
int query(int h, int s, int e, int idx, node tree[]) {
  if (tree[h].lazy) {
    tree[h].val += (e - s + 1) * tree[h].lazy;
    if (s != e) {
      tree[h << 1].lazy += tree[h].lazy;
      tree[h << 1 | 1].lazy += tree[h].lazy;
    }
    tree[h].lazy = 0;
  }
  if (s == e) {
    return tree[h].val;
  }
  int m = (s + e) >> 1;
  if (idx <= m)
    return query(h << 1, s, m, idx, tree);
  else
    return query(h << 1 | 1, m + 1, e, idx, tree);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  sw[1] = 0;
  dfs(1, 0);
  build(1, 0, n - 1, tree0);
  build(1, 0, n - 1, tree1);
  for (int i = 1; i <= m; i++) {
    int typ;
    scanf("%d", &typ);
    if (typ == 1) {
      int idx, x;
      scanf("%d%d", &idx, &x);
      if (sw[idx] == 0) {
        upd(1, 0, n - 1, st[idx], en[idx], x, tree0);
        upd(1, 0, n - 1, st[idx], en[idx], -x, tree1);
      } else {
        upd(1, 0, n - 1, st[idx], en[idx], -x, tree0);
        upd(1, 0, n - 1, st[idx], en[idx], x, tree1);
      }
    } else {
      int x;
      scanf("%d", &x);
      if (sw[x] == 0)
        printf("%d\n", query(1, 0, n - 1, st[x], tree0));
      else
        printf("%d\n", query(1, 0, n - 1, st[x], tree1));
    }
  }
  return 0;
}
