#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 5;
vector<vector<int>> adj(N);
int a[N], lvl[N], in[N], out[N], id;
vector<pair<int, int>> arr;
void dfs(int u, int par) {
  lvl[u] = lvl[par] + 1;
  in[u] = id++;
  for (auto v : adj[u]) {
    if (v == par) continue;
    dfs(v, u);
  }
  out[u] = id;
}
const int MAX = (1 << 20);
struct seg {
  int Tree[MAX], Lazy[MAX];
  void propagate(int cur, int l, int r) {
    if (Lazy[cur] == 0) return;
    Tree[cur] += Lazy[cur];
    int left = 2 * cur;
    int right = 2 * cur + 1;
    if (l != r) {
      Lazy[left] += Lazy[cur];
      Lazy[right] += Lazy[cur];
    }
    Lazy[cur] = 0;
  }
  void update(int cur, int l, int r, int a, int b, int val) {
    propagate(cur, l, r);
    if (a > r || b < l) return;
    if (a <= l && b >= r) {
      Lazy[cur] = val;
      propagate(cur, l, r);
      return;
    }
    int mid = (l + r) / 2;
    int left = 2 * cur;
    int right = 2 * cur + 1;
    update(left, l, mid, a, b, val);
    update(right, mid + 1, r, a, b, val);
  }
  int get(int cur, int l, int r, int i) {
    propagate(cur, l, r);
    if (l == r) return Tree[cur];
    int mid = (l + r) / 2;
    int left = 2 * cur;
    int right = 2 * cur + 1;
    if (i >= l && i <= mid)
      return get(left, l, mid, i);
    else
      return get(right, mid + 1, r, i);
  }
} sg[2];
int main() {
  ios::sync_with_stdio(0), ios_base::sync_with_stdio(0), cin.tie(0),
      cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    sg[0].update(1, 0, n, in[i], in[i], a[i]);
    sg[1].update(1, 0, n, in[i], in[i], a[i]);
  }
  while (m--) {
    int t;
    cin >> t;
    if (t == 1) {
      int u, v;
      cin >> u >> v;
      if (lvl[u] & 1) v *= -1;
      sg[0].update(1, 0, n, in[u], out[u] - 1, v);
      sg[1].update(1, 0, n, in[u], out[u] - 1, -v);
    } else {
      int u;
      cin >> u;
      int d = lvl[u] & 1;
      cout << sg[d].get(1, 0, n, in[u]) << '\n';
    }
  }
  return 0;
}
