#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int N, M;
int inival[MAXN];
vector<int> adj[MAXN];
int bit[MAXN][2];
int range[MAXN][2][2];
int level[MAXN];
int idx[2] = {1, 1};
int get(int idx, int cur) {
  int sum = 0;
  for (; idx > 0; idx -= idx & -idx) sum += bit[idx][cur];
  return sum;
}
void add(int idx, int val, int cur) {
  for (; idx <= N; idx += idx & -idx) bit[idx][cur] += val;
}
void dfs(int node, int par, int cur) {
  level[node] = cur;
  add(idx[cur], inival[node], cur);
  add(idx[cur] + 1, -inival[node], cur);
  range[node][cur][0] = idx[cur];
  range[node][(cur + 1) % 2][0] = idx[(cur + 1) % 2];
  idx[cur]++;
  for (int i = 0; i < adj[node].size(); i++)
    if (adj[node][i] != par) dfs(adj[node][i], node, (cur + 1) % 2);
  range[node][cur][1] = idx[cur];
  range[node][(cur + 1) % 2][1] = idx[(cur + 1) % 2];
}
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; i++) cin >> inival[i];
  for (int i = 0; i < N - 1; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1, 0, 0);
  for (int i = 0; i < M; i++) {
    int type;
    cin >> type;
    if (type == 1) {
      int node, val;
      cin >> node >> val;
      add(range[node][level[node]][0], val, level[node]);
      add(range[node][level[node]][1], -val, level[node]);
      add(range[node][(level[node] + 1) % 2][0], -val, (level[node] + 1) % 2);
      add(range[node][(level[node] + 1) % 2][1], val, (level[node] + 1) % 2);
    } else {
      int node;
      cin >> node;
      cout << get(range[node][level[node]][0], level[node]) << "\n";
    }
  }
  return 0;
}
