#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1, 1, -1, 1, -1}, dy[] = {-1, 1, 0, 0, 1, -1, -1, 1};
void run();
int main() {
  ios::sync_with_stdio(0);
  cout << fixed << setprecision(16);
  run();
}
const int maxn = 200200;
int odd[maxn];
int even[maxn];
int lvl[maxn];
int a[maxn];
int from[maxn];
int to[maxn];
int n, m;
int read_idx(int tree[], int idx) {
  int sum = 0;
  for (; idx <= n; idx += idx & -idx) sum += tree[idx];
  return sum;
}
void update_prefix(int tree[], int idx, int val) {
  if (idx < 1) return;
  for (; idx > 0; idx -= idx & -idx) tree[idx] += val;
}
void update_range(int tree[], int from, int to, int val) {
  update_prefix(tree, from - 1, -val);
  update_prefix(tree, to, val);
}
vector<int> adj[maxn];
int cnt = 1;
void dfs(int x, int yy = -1, int d = 0) {
  lvl[x] = d;
  from[x] = cnt++;
  for (auto y : adj[x]) {
    if (y != yy) {
      dfs(y, x, d + 1);
    }
  }
  to[x] = cnt - 1;
}
void run() {
  cin >> n >> m;
  for (int i = (0); i < (n); ++i) cin >> a[i];
  for (int i = (0); i < (n - 1); ++i) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  dfs(0);
  for (int i = (0); i < (m); ++i) {
    int t;
    cin >> t;
    if (t == 1) {
      int x, y;
      cin >> x >> y;
      x--;
      if (lvl[x] % 2 == 0) {
        update_range(even, from[x], to[x], y);
        update_range(odd, from[x], to[x], -y);
      } else {
        update_range(even, from[x], to[x], -y);
        update_range(odd, from[x], to[x], y);
      }
    } else {
      int x;
      cin >> x;
      x--;
      int res = a[x];
      if (lvl[x] % 2 == 0)
        res += read_idx(even, from[x]);
      else
        res += read_idx(odd, from[x]);
      cout << res << "\n";
    }
  }
}
