#include <bits/stdc++.h>
using namespace std;
void readfile() {
  ios_base ::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
}
const long long nmax = (long long)1e6 + 20;
long long n, m;
long long a[nmax];
vector<long long> graph[nmax], gg[nmax];
bool vis[nmax];
void dfs(long long u) {
  vis[u] = true;
  for (__typeof((graph[u]).begin()) it = (graph[u]).begin();
       it != (graph[u]).end(); it++) {
    long long v = *it;
    if (vis[v] == false) {
      gg[u].push_back(v);
      dfs(v);
    }
  }
}
long long le[nmax], ri[nmax], cnt = -1, lev[nmax];
vector<long long> nodeseq;
void dfs1(long long u) {
  le[u] = ++cnt;
  nodeseq.push_back(u);
  for (__typeof((gg[u]).begin()) it = (gg[u]).begin(); it != (gg[u]).end();
       it++) {
    long long v = *it;
    lev[v] = lev[u] + 1;
    dfs1(v);
  }
  ri[u] = cnt;
}
pair<long long, long long> lazy[nmax * 5];
void build(long long id, long long lo, long long hi) {
  lazy[id] = make_pair(0, 0);
  if (lo == hi) return;
  long long mid = (lo + hi) / 2;
  build(id * 2, lo, mid);
  build(id * 2 + 1, mid + 1, hi);
}
void update(long long id, long long lo, long long hi, long long uu,
            long long val) {
  if (lo != hi) {
    lazy[id * 2].first += lazy[id].first;
    lazy[id * 2].second += lazy[id].second;
    lazy[id * 2 + 1].first += lazy[id].first;
    lazy[id * 2 + 1].second += lazy[id].second;
    lazy[id] = make_pair(0, 0);
  }
  long long beg = le[uu];
  long long fin = ri[uu];
  if (lo > fin || hi < beg) return;
  if (beg <= lo && hi <= fin) {
    if (lev[uu] % 2 == 0) {
      lazy[id].first += val;
      lazy[id].second += -val;
    } else {
      lazy[id].first += -val;
      lazy[id].second += val;
    }
    return;
  }
  long long mid = (lo + hi) / 2;
  update(id * 2, lo, mid, uu, val);
  update(id * 2 + 1, mid + 1, hi, uu, val);
  return;
}
long long query(long long id, long long lo, long long hi, long long uu) {
  if (lo != hi) {
    lazy[id * 2].first += lazy[id].first;
    lazy[id * 2].second += lazy[id].second;
    lazy[id * 2 + 1].first += lazy[id].first;
    lazy[id * 2 + 1].second += lazy[id].second;
    lazy[id] = make_pair(0, 0);
  }
  long long beg = le[uu];
  long long fin = le[uu];
  if (lo > fin || hi < beg) return 0;
  if (beg <= lo && hi <= fin) {
    if (lev[uu] % 2 == 0) {
      return a[nodeseq[beg]] + lazy[id].first;
    } else {
      return a[nodeseq[beg]] + lazy[id].second;
    }
  }
  long long mid = (lo + hi) / 2;
  long long A = query(id * 2, lo, mid, uu);
  long long B = query(id * 2 + 1, mid + 1, hi, uu);
  return A + B;
}
signed main() {
  readfile();
  cin >> n >> m;
  for (long long i = (long long)0; i <= (long long)n - 1; i++) {
    cin >> a[i];
  }
  long long nn = n - 1;
  while (nn--) {
    long long u, v;
    cin >> u >> v;
    u--;
    v--;
    graph[u].push_back(v);
    graph[v].push_back(u);
  }
  memset(vis, 0, sizeof vis);
  dfs(0);
  memset(lev, -1, sizeof lev);
  lev[0] = 0;
  dfs1(0);
  build(1, 0, n - 1);
  while (m--) {
    long long flag, uu, val;
    cin >> flag;
    if (flag == 1) {
      cin >> uu >> val;
      uu--;
      update(1, 0, n - 1, uu, val);
    } else {
      cin >> uu;
      uu--;
      long long res = query(1, 0, n - 1, uu);
      cout << res << endl;
    }
  }
  return 0;
}
