#include <bits/stdc++.h>
using namespace std;
const int N = 200 * 1000 + 10;
int a[N * 4], num[N], st[N], en[N], cnt, hi[N], seg[2][N * 4];
bool mark[N];
vector<int> graph[N], h[2];
void build(int ind, int p, int val, int v, int s, int e) {
  if (e - s < 2) {
    seg[ind][v] = val;
    return;
  }
  int mid = (s + e) / 2;
  if (p < mid)
    build(ind, p, val, 2 * v, s, mid);
  else
    build(ind, p, val, 2 * v + 1, mid, e);
}
void upd(int ind, int l, int r, int val, int v, int s, int e) {
  if (l <= s && e <= r) {
    seg[ind][v] += val;
    return;
  }
  if (l >= e || r <= s) return;
  int mid = (s + e) / 2;
  upd(ind, l, r, val, 2 * v, s, mid);
  upd(ind, l, r, val, 2 * v + 1, mid, e);
}
int get(int ind, int p, int v, int s, int e) {
  if (e - s < 2) return seg[ind][v];
  int mid = (s + e) / 2;
  int ans = seg[ind][v];
  if (p < mid)
    ans += get(ind, p, 2 * v, s, mid);
  else
    ans += get(ind, p, 2 * v + 1, mid, e);
  return ans;
}
void dfs(int v) {
  cnt++;
  h[hi[v] % 2].push_back(cnt);
  st[v] = cnt;
  mark[v] = true;
  for (int i = 0; i < (int)graph[v].size(); i++) {
    int u = graph[v][i];
    if (!mark[u]) {
      hi[u] = hi[v] + 1;
      dfs(u);
    }
  }
  en[v] = cnt;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> num[i];
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  dfs(0);
  for (int i = 0; i < n; i++) {
    int y = hi[i] % 2;
    int ind = lower_bound(h[y].begin(), h[y].end(), st[i]) - h[y].begin();
    build(y, ind, num[i], 1, 0, n);
  }
  for (int i = 0; i < m; i++) {
    int t, x;
    cin >> t >> x;
    x--;
    int y = hi[x] % 2;
    int ind1 = lower_bound(h[y].begin(), h[y].end(), st[x]) - h[y].begin();
    if (t == 1) {
      int val;
      cin >> val;
      int ind2 = upper_bound(h[y].begin(), h[y].end(), en[x]) - h[y].begin();
      upd(y, ind1, ind2, val, 1, 0, n);
      y ^= 1;
      int ind3 = lower_bound(h[y].begin(), h[y].end(), st[x]) - h[y].begin();
      int ind4 = upper_bound(h[y].begin(), h[y].end(), en[x]) - h[y].begin();
      upd(y, ind3, ind4, -val, 1, 0, n);
    } else
      cout << get(y, ind1, 1, 0, n) << endl;
  }
  return 0;
}
