#include <bits/stdc++.h>
using namespace std;
int modpower(int a, int b, int c) {
  int res = 1;
  while (b) {
    if (b & 1LL) res = (res * a) % c;
    a = (a * a) % c;
    b >>= 1;
  }
  return res;
}
vector<int> v[200001];
pair<pair<int, int>, pair<int, int> > dp[200001];
int preo[200001];
int pree[200001];
bool lev[200001];
int a[200001];
int timeo, timee;
int tree[800001][2];
int lazy[800001][2];
void dfs(int ver, int p, int f) {
  dp[ver].first.first = timee;
  dp[ver].second.first = timeo;
  lev[ver] = f;
  if (f == 0) {
    pree[timee] = ver;
    timee++;
  } else {
    preo[timeo] = ver;
    timeo++;
  }
  for (int i = 0; i < v[ver].size(); i++) {
    if (v[ver][i] != p) {
      dfs(v[ver][i], ver, (f + 1) % 2);
    }
  }
  dp[ver].first.second = timee;
  dp[ver].second.second = timeo;
}
void build(int node, int start, int end, int idx) {
  if (end < start) return;
  if (start == end) {
    if (idx == 0)
      tree[node][idx] = a[pree[start]];
    else
      tree[node][idx] = a[preo[start]];
    return;
  }
  int mid = (start + end) / 2;
  build(2 * node, start, mid, idx);
  build(2 * node + 1, mid + 1, end, idx);
  tree[node][idx] = tree[2 * node][idx] + tree[2 * node + 1][idx];
}
void update(int node, int start, int end, int l, int r, int idx, int val) {
  if (end < start) return;
  if (lazy[node][idx] != 0) {
    tree[node][idx] += (end - start + 1) * lazy[node][idx];
    if (start != end) {
      lazy[2 * node][idx] += lazy[node][idx];
      lazy[2 * node + 1][idx] += lazy[node][idx];
    }
    lazy[node][idx] = 0;
  }
  if (start > r || end < l) return;
  if (start >= l && end <= r) {
    tree[node][idx] += (end - start + 1) * val;
    if (start != end) {
      lazy[2 * node][idx] += val;
      lazy[2 * node + 1][idx] += val;
    }
    return;
  }
  int mid = (start + end) / 2;
  update(2 * node, start, mid, l, r, idx, val);
  update(2 * node + 1, mid + 1, end, l, r, idx, val);
  tree[node][idx] = tree[2 * node][idx] + tree[2 * node + 1][idx];
}
int query(int node, int start, int end, int idx, int num) {
  if (end < start) return 0;
  if (lazy[node][idx] != 0) {
    tree[node][idx] += (end - start + 1) * lazy[node][idx];
    if (start != end) {
      lazy[2 * node][idx] += lazy[node][idx];
      lazy[2 * node + 1][idx] += lazy[node][idx];
    }
    lazy[node][idx] = 0;
  }
  if (start == end) {
    return tree[node][idx];
  }
  int mid = (start + end) / 2;
  if (num <= mid)
    return query(2 * node, start, mid, idx, num);
  else
    return query(2 * node + 1, mid + 1, end, idx, num);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 0; i < n - 1; i++) {
    int aa, b;
    cin >> aa >> b;
    v[aa].push_back(b);
    v[b].push_back(aa);
  }
  dfs(1, -1, 0);
  build(1, 0, timee - 1, 0);
  build(1, 0, timeo - 1, 1);
  while (m--) {
    int ty;
    cin >> ty;
    if (ty == 1) {
      int x, val;
      cin >> x >> val;
      if (lev[x]) {
        if (dp[x].first.first <= dp[x].first.second - 1)
          update(1, 0, timee - 1, dp[x].first.first, dp[x].first.second - 1, 0,
                 -val);
        update(1, 0, timeo - 1, dp[x].second.first, dp[x].second.second - 1, 1,
               val);
      } else {
        if (dp[x].second.first <= dp[x].second.second - 1)
          update(1, 0, timeo - 1, dp[x].second.first, dp[x].second.second - 1,
                 1, -val);
        update(1, 0, timee - 1, dp[x].first.first, dp[x].first.second - 1, 0,
               val);
      }
    } else {
      int x;
      cin >> x;
      if (lev[x])
        cout << query(1, 0, timeo - 1, 1, dp[x].second.first) << '\n';
      else
        cout << query(1, 0, timee - 1, 0, dp[x].first.first) << '\n';
    }
  }
  return 0;
}
