#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int tree[2 * N];
inline void update(int idx, int val) {
  while (idx < 2 * N) {
    tree[idx] += val;
    idx += idx & -idx;
  }
}
inline int query(int idx) {
  int sm = 0;
  while (idx > 0) {
    sm += tree[idx];
    idx -= idx & -idx;
  }
  return sm;
}
int a[N];
vector<int> adj[N];
int depth[N];
int tin[N];
int tout[N];
bool vis[N];
inline void dfs(int u, int par = -1) {
  if (par != -1) depth[u] = 1 + depth[par];
  vis[u] = true;
  static int timer = 0;
  tin[u] = ++timer;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
    if (vis[v]) continue;
    dfs(v, u);
  }
  tout[u] = ++timer;
}
int main() {
  int n, q;
  scanf("%d", &n);
  ;
  scanf("%d", &q);
  ;
  for (int i = 1; i < n + 1; i++) scanf("%d", &a[i]);
  ;
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d", &x);
    ;
    scanf("%d", &y);
    ;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  dfs(1);
  while (q--) {
    int tp, x, y;
    scanf("%d", &tp);
    ;
    if (tp == 1) {
      scanf("%d", &x);
      ;
      scanf("%d", &y);
      ;
      if (depth[x] % 2 == 0) {
        update(tin[x], y);
        update(tout[x], -y);
      } else {
        update(tin[x], -y);
        update(tout[x], y);
      }
    } else {
      scanf("%d", &x);
      ;
      if (depth[x] % 2 == 0) {
        printf("%d\n", query(tin[x]) + a[x]);
      } else {
        printf("%d\n", -query(tin[x]) + a[x]);
      }
    }
  }
  return 0;
}
