#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r;
  int val;
  int d;
  Node(int a = 0, int b = 0, int c = 0, int k = 0) : l(a), r(b), val(c), d(k) {}
};
int g_n, g_m, g_cnt;
vector<Node> vn;
vector<vector<int>> vvi_bit;
vector<vector<int>> vvi_edge;
bool input() {
  cin >> g_n >> g_m;
  if (cin.eof()) return false;
  g_cnt = 0;
  vn.clear(), vvi_bit.clear(), vvi_edge.clear();
  vn.resize(g_n + 1), vvi_edge.resize(g_n + 1), vvi_bit.resize(2);
  vvi_bit.front().resize(2 * (g_n + 1)), vvi_bit.back().resize(2 * (g_n + 1));
  int u, v, w;
  for (int i = 1; i <= g_n; ++i) {
    scanf("%d", &w);
    vn[i].val = w;
  }
  for (int i = 1; i < g_n; ++i) {
    scanf("%d%d", &u, &v);
    vvi_edge[u].push_back(v);
    vvi_edge[v].push_back(u);
  }
  return true;
}
void dfs(int u, int p, int d) {
  vn[u].l = ++g_cnt;
  vn[u].d = d;
  for (auto &v : vvi_edge[u]) {
    if (v == p) continue;
    dfs(v, u, 1 - d);
  }
  vn[u].r = ++g_cnt;
}
int get(int x, vector<int> &vi) {
  int ans = 0;
  while (x > 0) {
    ans += vi[x];
    x -= x & (x ^ (x - 1));
  }
  return ans;
}
void add(int x, int w, vector<int> &vi) {
  while (x <= g_n * 2) {
    vi[x] += w;
    x += x & (x ^ (x - 1));
  }
}
void solve() {
  dfs(1, -1, 0);
  int k, u, v, x, ans;
  for (int i = 0; i < g_m; ++i) {
    scanf("%d", &k);
    if (k == 1) {
      scanf("%d%d", &u, &v);
      Node n = vn[u];
      add(n.l, v, vvi_bit[n.d]);
      add(n.r + 1, -v, vvi_bit[n.d]);
    } else {
      scanf("%d", &x);
      Node n = vn[x];
      ans = n.val + get(n.l, vvi_bit[n.d]) - get(n.l, vvi_bit[1 - n.d]);
      printf("%d\n", ans);
    }
  }
}
int main() {
  while (input()) {
    solve();
  }
  return 0;
}
