#include <bits/stdc++.h>
using namespace std;
int bit[2 * 200005];
int n;
int a[200005];
int in[200005];
int out[200005];
vector<int> v[200005];
void update(int idx, int val) {
  for (int x = idx; x <= 400000; x += x & -x) bit[x] += val;
}
int query(int idx) {
  int ret = 0;
  for (int x = idx; x > 0; x -= x & -x) ret += bit[x];
  return ret;
}
int vis[200005];
int t = 0;
int lvl[200005];
void dfs(int x) {
  vis[x] = 1;
  in[x] = ++t;
  int l = v[x].size();
  for (int i = 0; i < l; i++) {
    if (vis[v[x][i]]) continue;
    lvl[v[x][i]] = lvl[x] + 1;
    dfs(v[x][i]);
  }
  out[x] = ++t;
}
int main() {
  cin.sync_with_stdio(false);
  cin >> n;
  int m;
  cin >> m;
  int a1, b;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 0; i < n - 1; i++) {
    cin >> a1 >> b;
    v[a1].push_back(b);
    v[b].push_back(a1);
  }
  dfs(1);
  while (m--) {
    int h, val, y;
    cin >> h;
    if (h == 1) {
      cin >> y >> val;
      if (lvl[y] % 2 == 1) {
        update(in[y], -val);
        update(out[y], val);
      } else {
        update(in[y], val);
        update(out[y], -val);
      }
    } else {
      cin >> y;
      if (lvl[y] % 2 == 1) {
        cout << a[y] - query(in[y]) << endl;
      } else
        cout << a[y] + query(in[y]) << endl;
    }
  }
  return 0;
}
