#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
const long long inf = 1e+9;
template <typename T>
istream &operator>>(istream &, vector<T> &);
template <typename T>
ostream &operator<<(ostream &, const vector<T> &);
const int maxn = 4 * 200005;
vector<vector<int> > g;
int vtx[2][maxn] = {};
vector<int> tin, tout, lvl;
vector<pair<int, int> > mas[2];
int timer;
void dfs(int v, int p = -1, int level = 0) {
  lvl[v] = level % 2;
  tin[v] = timer++;
  mas[level % 2].push_back(make_pair(tin[v], v));
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (to != p) {
      dfs(to, v, level + 1);
    }
  }
  tout[v] = timer;
}
void add(int v, int idx, int tl, int tr, int l, int r, int val) {
  if (l > r) return;
  if (tl == l && tr == r) {
    vtx[idx][v] += val;
  } else {
    int tm = (tl + tr) / 2;
    add(2 * v, idx, tl, tm, l, min(tm, r), val);
    add(2 * v + 1, idx, tm + 1, tr, max(l, tm + 1), r, val);
  }
}
int get(int v, int idx, int tl, int tr, int pos) {
  if (tl == tr && tl == pos)
    return vtx[idx][v];
  else {
    int tm = (tl + tr) / 2;
    if (pos <= tm) {
      return vtx[idx][v] + get(2 * v, idx, tl, tm, pos);
    } else {
      return vtx[idx][v] + get(2 * v + 1, idx, tm + 1, tr, pos);
    }
  }
}
int getV(int idx, int v) {
  int pos =
      lower_bound(mas[idx].begin(), mas[idx].end(), make_pair(tin[v], v)) -
      mas[idx].begin();
  return get(1, idx, 0, mas[idx].size() - 1, pos);
}
void upd(int idx, int v, int val) {
  int l1 = lower_bound(mas[idx].begin(), mas[idx].end(), make_pair(tin[v], v)) -
           mas[idx].begin();
  int r1 =
      upper_bound(mas[idx].begin(), mas[idx].end(), make_pair(tout[v], -1)) -
      mas[idx].begin() - 1;
  add(1, idx, 0, mas[idx].size() - 1, l1, r1, val);
  idx ^= 1;
  int l2 = lower_bound(mas[idx].begin(), mas[idx].end(), make_pair(tin[v], v)) -
           mas[idx].begin();
  int r2 =
      upper_bound(mas[idx].begin(), mas[idx].end(), make_pair(tout[v], -1)) -
      mas[idx].begin() - 1;
  add(1, idx, 0, mas[idx].size() - 1, l2, r2, -val);
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  vector<int> a(n);
  g.resize(n);
  tin.resize(n);
  tout.resize(n);
  lvl.resize(n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    u--;
    v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(0);
  for (int i = 0; i < m; i++) {
    int type;
    scanf("%d", &type);
    if (type == 1) {
      int x, val;
      scanf("%d %d", &x, &val);
      x--;
      upd(lvl[x], x, val);
    } else {
      int x;
      scanf("%d", &x);
      x--;
      printf("%d\n", getV(lvl[x], x) + a[x]);
    }
  }
  return 0;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
  for (int i = 0; i < v.size(); ++i) is >> v[i];
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < v.size(); ++i) os << v[i] << " ";
  return os;
}
