#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, bgin[200100], l[200100], endd[200100], preorder[200100],
    a[200100], order, oddBit[200100], evenBit[200100];
vector<int> graph[200100];
int query(int x, int lvl) {
  int sum = 0;
  for (; x > 0; x -= (x & (-x))) {
    if (lvl % 2 == 0)
      sum += evenBit[x];
    else
      sum += oddBit[x];
  }
  return sum;
}
void update(int x, int lvl, int val) {
  for (; x <= 200000; x += (x & (-x))) {
    if (lvl % 2 == 0) {
      evenBit[x] += val;
      oddBit[x] -= val;
    } else {
      evenBit[x] -= val;
      oddBit[x] += val;
    }
  }
}
void dfs(int u, int lvl) {
  ++order;
  bgin[u] = order;
  l[u] = lvl;
  preorder[order] = u;
  for (int i = 0; i < graph[u].size(); i++) {
    int v = graph[u][i];
    dfs(v, lvl + 1);
  }
  endd[u] = order;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n - 1; i++) {
    scanf("%d %d", &x, &y);
    graph[x].push_back(y);
  }
  dfs(1, 1);
  for (int i = 0; i < m; i++) {
    int cmd;
    scanf("%d", &cmd);
    if (cmd == 1) {
      scanf("%d %d", &x, &y);
      update(bgin[x], l[x], y);
      update(endd[x] + 1, l[x], -y);
    } else {
      scanf("%d", &x);
      printf("%d\n", query(bgin[x], l[x]) + a[x]);
    }
  }
  return 0;
}
