#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[200005];
vector<int> adj[200005];
int L[200005], P[200005], sz[200005], sc[200005];
bool visited[200005];
int chainNo = 0, ptr = 0;
int chainIdx[200005], chainPos[200005], chainSize[200005], chainHead[200005];
int baseArr[200005], posBase[200005];
int st[4 * 200005];
void init() {
  memset(visited, false, sizeof(visited));
  for (int i = 0; i < 200005; i++) {
    chainIdx[i] = chainPos[i] = chainHead[i] = -1;
    chainSize[i] = 0;
  }
  for (int i = 0; i < 4 * 200005; i++) {
    st[i] = 0;
  }
  return;
}
void updateTree(int x, int val, int l = 0, int r = n - 1, int idx = 0) {
  if (l == r) {
    st[idx] += val;
    return;
  }
  int mid = l + (r - l) / 2;
  if (x <= mid)
    updateTree(x, val, l, mid, 2 * idx + 1);
  else
    updateTree(x, val, mid + 1, r, 2 * idx + 2);
  st[idx] = st[2 * idx + 1] + st[2 * idx + 2];
  return;
}
int queryTree(int x, int y, int l = 0, int r = n - 1, int idx = 0) {
  if (y < l || r < x)
    return 0;
  else if (x <= l && r <= y) {
    return st[idx];
  }
  int mid = l + (r - l) / 2;
  return queryTree(x, y, l, mid, 2 * idx + 1) +
         queryTree(x, y, mid + 1, r, 2 * idx + 2);
}
void dfs(int src) {
  visited[src] = true;
  sz[src] = 1;
  sc[src] = -1;
  int maxm = 0;
  for (auto it : adj[src]) {
    if (!visited[it]) {
      P[it] = src;
      L[it] = L[src] + 1;
      dfs(it);
      sz[src] += sz[it];
      if (sz[it] > maxm) {
        sc[src] = it;
        maxm = sz[it];
      }
    }
  }
  return;
}
void hld(int cur) {
  visited[cur] = true;
  if (chainHead[chainNo] == -1) chainHead[chainNo] = cur;
  chainIdx[cur] = chainNo;
  chainPos[cur] = chainSize[chainNo];
  baseArr[ptr] = 0;
  posBase[cur] = ptr;
  ptr++;
  chainSize[chainNo]++;
  if (sc[cur] != -1) {
    hld(sc[cur]);
  }
  for (auto it : adj[cur]) {
    if (!visited[it] && it != sc[cur]) {
      chainNo++;
      hld(it);
    }
  }
  return;
}
int query_up(int l, int u) {
  int uchain = chainIdx[u];
  bool ltype = L[l] % 2;
  int ans = 0;
  while (1) {
    int lchain = chainIdx[l];
    if (uchain == lchain) {
      ans += queryTree(posBase[u], posBase[l]);
      break;
    }
    int h = chainHead[chainIdx[l]];
    ans += queryTree(posBase[h], posBase[l]);
    l = P[h];
  }
  if (ltype) ans = -ans;
  return ans;
}
void update(int x, int val) {
  int idx = posBase[x];
  if (L[x] % 2 == 0)
    updateTree(idx, val);
  else
    updateTree(idx, -val);
  return;
}
int query(int x) {
  int ans = query_up(x, 0);
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  init();
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  int u, v;
  for (int i = 0; i < n - 1; i++) {
    cin >> u >> v;
    u--;
    v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  P[0] = -1;
  L[0] = 0;
  dfs(0);
  memset(visited, false, sizeof(visited));
  hld(0);
  int t;
  int x, val;
  while (m--) {
    cin >> t;
    if (t == 1) {
      cin >> x >> val;
      x--;
      update(x, val);
    } else if (t == 2) {
      cin >> x;
      x--;
      int ans = query(x);
      ans += a[x];
      cout << ans << "\n";
    }
  }
  return 0;
}
