#include <bits/stdc++.h>
using namespace std;
int tree[2][200005];
vector<int> gr[200001];
pair<int, int> rng[200001];
int lev[200001];
int tm;
bool vis[200001];
vector<int> d[2];
void add(int i, int val, int t) {
  while (i <= 200004) {
    tree[t][i] += val;
    i += i & -i;
  }
}
int read(int i, int t) {
  int ans = 0;
  while (i) {
    ans += tree[t][i];
    i -= i & -i;
  }
  return ans;
}
void dfs(int cur, int level) {
  vis[cur] = true;
  int st = tm++;
  lev[cur] = level;
  d[level].push_back(st);
  for (int i = 0; i < gr[cur].size(); i++) {
    if (!vis[gr[cur][i]]) dfs(gr[cur][i], level ^ 1);
  }
  int ed = tm - 1;
  rng[cur] = pair<int, int>(st, ed);
}
int main(int argc, char const *argv[]) {
  int n, m;
  scanf("%d%d", &n, &m);
  int a[n];
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    gr[x].push_back(y);
    gr[y].push_back(x);
  }
  tm = 1;
  dfs(1, 0);
  while (m--) {
    int c;
    scanf("%d", &c);
    if (c == 1) {
      int x, val;
      scanf("%d%d", &x, &val);
      int st = rng[x].first, ed = rng[x].second;
      int l = lev[x];
      int x1 = lower_bound(d[l].begin(), d[l].end(), st) - d[l].begin();
      int x2 =
          lower_bound(d[l ^ 1].begin(), d[l ^ 1].end(), st) - d[l ^ 1].begin();
      int y1 = upper_bound(d[l].begin(), d[l].end(), ed) - d[l].begin();
      int y2 =
          upper_bound(d[l ^ 1].begin(), d[l ^ 1].end(), ed) - d[l ^ 1].begin();
      if (x1 < d[l].size()) add(d[l][x1], val, l);
      if (y1 < d[l].size()) add(d[l][y1], -val, l);
      if (x2 < d[l ^ 1].size()) add(d[l ^ 1][x2], -val, l ^ 1);
      if (y2 < d[l ^ 1].size()) add(d[l ^ 1][y2], val, l ^ 1);
    } else {
      int x;
      scanf("%d", &x);
      int ans = read(rng[x].first, lev[x]) + a[x - 1];
      printf("%d\n", ans);
    }
  }
  return 0;
}
