#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
using namespace std;
const long long inf = 1000000000000000000;
const long long KOK = 100000;
const long long LOG = 30;
const long long li = 200005;
const long long mod = 1000000007;
long long n, m, b[li], a[li], k, flag, t, from[li], to[li], say, tree[li * 4],
    tut[li], dep[li], yes, lazy[li * 4][5];
long long cev;
string s;
vector<long long> v[li];
inline void build(long long node, long long start, long long end) {
  if (start == end) {
    tree[node] = a[tut[start]];
    return;
  }
  build(node * 2, start, ((start + end) / 2)),
      build(node * 2 + 1, ((start + end) / 2) + 1, end);
  tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
inline void push(long long node, long long start, long long end) {
  if (dep[start] % 2 == 0) {
    tree[node] += lazy[node][0];
    tree[node] -= lazy[node][1];
  }
  if (dep[start] % 2 == 1) {
    tree[node] -= lazy[node][0];
    tree[node] += lazy[node][1];
  }
  if (start != end) {
    lazy[node * 2][0] += lazy[node][0];
    lazy[node * 2 + 1][0] += lazy[node][0];
    lazy[node * 2][1] += lazy[node][1];
    lazy[node * 2 + 1][1] += lazy[node][1];
  }
  lazy[node][0] = 0;
  lazy[node][1] = 0;
}
inline void update(long long node, long long start, long long end, long long l,
                   long long r, long long val) {
  push(node, start, end);
  if (start > end || start > r || end < l) return;
  if (start >= l && end <= r) {
    lazy[node][yes % 2] += val;
    push(node, start, end);
    return;
  }
  update(node * 2, start, ((start + end) / 2), l, r, val),
      update(node * 2 + 1, ((start + end) / 2) + 1, end, l, r, val);
}
inline long long query(long long node, long long start, long long end,
                       long long l, long long r) {
  if (start > end || start > r || end < l) return 0;
  push(node, start, end);
  if (start >= l && end <= r) return tree[node];
  return query(node * 2, start, ((start + end) / 2), l, r) +
         query(node * 2 + 1, ((start + end) / 2) + 1, end, l, r);
}
inline void dfs(long long node, long long ata, long long der) {
  from[node] = ++say;
  to[node] = say;
  tut[say] = node;
  dep[say] = der;
  for (long long i = 0; i < (long long)v[node].size(); i++) {
    long long go = v[node][i];
    if (go == ata) continue;
    dfs(go, node, der + 1);
    to[node] = max(to[node], to[go]);
  }
}
int32_t main(void) {
  scanf("%lld %lld", &n, &t);
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (long long i = 1; i < n; i++) {
    long long x, y;
    scanf("%lld %lld", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1, 0, 0);
  build(1, 1, n);
  while (t--) {
    long long ty, x, y;
    scanf("%lld %lld", &ty, &x);
    if (ty == 1) {
      scanf("%lld", &y);
      yes = dep[from[x]];
      update(1, 1, n, from[x], to[x], y);
      continue;
    }
    printf("%lld\n", query(1, 1, n, from[x], from[x]));
  }
  return 0;
}
