#include <bits/stdc++.h>
using namespace std;
bool visited[200005];
int idx = 1, in[400005], fin[400005], nivel[200005];
vector<vector<int> > adj;
struct FenTree {
  vector<int> tree;
  FenTree(int n) : tree(n * 2 + 1, 0) {}
  void Actualizar(int i, int v) {
    while (i < (int)tree.size()) {
      tree[i] += v;
      i += i & -i;
    }
  }
  int Query(int i) {
    int sum = 0;
    while (i > 0) {
      sum += tree[i];
      i -= i & -i;
    }
    return sum;
  }
  int Rango(int i, int j) { return Query(j) - Query(i - 1); }
};
void dfs(int u, int niv) {
  visited[u] = true;
  nivel[u] = niv % 2;
  in[u] = idx;
  for (int i = 0; i < (int)adj[u].size(); i++) {
    if (!visited[adj[u][i]]) {
      idx++;
      dfs(adj[u][i], niv + 1);
    }
  }
  idx++;
  fin[u] = idx;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, x, a, b;
  vector<int> v;
  cin >> n >> m;
  adj.assign(n + 1, vector<int>());
  fill(visited, visited + n + 1, false);
  for (int i = 0; i < n; i++) {
    cin >> x;
    v.push_back(x);
  }
  for (int i = 1; i < n; i++) {
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  dfs(1, 0);
  FenTree *FT = new FenTree(n);
  while (m--) {
    cin >> a >> b;
    if (a == 1) {
      cin >> a;
      if (!nivel[b]) {
        FT->Actualizar(in[b], a);
        FT->Actualizar(fin[b], -a);
      } else {
        FT->Actualizar(in[b], -a);
        FT->Actualizar(fin[b], a);
      }
    } else {
      if (!nivel[b])
        cout << FT->Query(in[b]) + v[b - 1] << '\n';
      else
        cout << -FT->Query(in[b]) + v[b - 1] << '\n';
    }
  }
  return 0;
}
