#include <bits/stdc++.h>
using namespace std;
long long INF = 1e18;
long long MOD = 1e9;
vector<long long> aList[200100];
long long fw[200100];
long long N, Q, a, b, c;
struct node {
  long long second, e, m;
  long long v;
  node *l, *r;
  node(long long _s, long long _e) {
    second = _s;
    e = _e;
    m = (second + e) / 2;
    v = 0;
    if (second != e) {
      l = new node(second, m);
      r = new node(m + 1, e);
    }
  }
  void update(long long x, long long val) {
    if (second == e) {
      v += val;
      return;
    }
    if (x <= m) l->update(x, val);
    if (x > m) r->update(x, val);
    v = l->v + r->v;
  }
  long long query(long long x, long long y) {
    if (second == x && y == e) return v;
    if (y <= m) return l->query(x, y);
    if (x > m) return r->query(x, y);
    return l->query(x, m) + r->query(m + 1, y);
  }
} * root;
long long p[200100], depth[200100], heavy[200100], head[200100], pos[200100];
long long A[200100];
long long cur;
long long dfs(long long x) {
  long long size = 1;
  long long mchild = 0;
  for (auto i : aList[x]) {
    if (i == p[x]) continue;
    p[i] = x;
    depth[i] = depth[x] + 1;
    long long cs = dfs(i);
    size += cs;
    if (cs > mchild) {
      mchild = cs;
      heavy[x] = i;
    }
  }
  return size;
}
void decompose(long long x, long long h) {
  head[x] = h;
  pos[x] = cur++;
  if (heavy[x] != -1) decompose(heavy[x], h);
  for (auto i : aList[x]) {
    if (i == p[x] || i == heavy[x]) continue;
    decompose(i, i);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> Q;
  for (long long i = 1; i <= N; ++i) {
    cin >> A[i];
  }
  for (long long i = 1; i < N; ++i) {
    cin >> a >> b;
    aList[a].push_back(b);
    aList[b].push_back(a);
  }
  memset(heavy, -1, sizeof(heavy));
  cur = 1;
  dfs(1);
  decompose(1, 1);
  root = new node(1, N);
  while (Q--) {
    cin >> c;
    if (c == 1) {
      cin >> a >> b;
      if (depth[a] % 2 == 0) {
        root->update(pos[a], b);
      } else {
        root->update(pos[a], -b);
      }
    } else {
      cin >> a;
      int l = depth[a] % 2;
      long long res = A[a];
      while (head[a] != 1) {
        if (l % 2 == 1)
          res -= root->query(pos[head[a]], pos[a]);
        else
          res += root->query(pos[head[a]], pos[a]);
        a = p[head[a]];
      }
      if (l % 2 == 1)
        res -= root->query(1, pos[a]);
      else
        res += root->query(1, pos[a]);
      cout << res << '\n';
    }
  }
}
