#include <bits/stdc++.h>
using namespace std;
const int INF = ~(1 << 31);
const double E = exp(1.0);
const double Pi = 4 * atan(1.0);
int solve(int);
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int T, i;
  T = 1;
  for (i = 1; i <= T; ++i) {
    int x = solve(i);
  }
  return 0;
}
int n, m;
const int N = 2e5 + 5;
const int md = 1e9 + 7;
vector<int> a[N];
int L[N], R[N], level[N], num[N], rnum[N], v[N];
int cnt = 0;
int dfs(int x, int pre, int lv) {
  int m = a[x].size(), i;
  num[x] = ++cnt;
  rnum[cnt] = x;
  L[cnt] = R[cnt] = cnt;
  level[cnt] = lv;
  for (i = 0; i <= m - 1; ++i) {
    if (a[x][i] == pre) continue;
    R[num[x]] = dfs(a[x][i], x, lv + 1);
  }
  return R[num[x]];
}
struct Tree {
  int v, flag[2];
  void z() { flag[0] = flag[1] = 0; }
} tree[4 * N];
void build(int n, int l, int r) {
  if (l == r) {
    tree[n].v = v[rnum[l]];
    tree[n].z();
    return;
  }
  int mid = (l + r) >> 1, n1 = n << 1, n2 = (n << 1) + 1;
  build(n1, l, mid);
  build(n2, mid + 1, r);
}
int to(int* a, int x) {
  int lv = level[x];
  return lv & 1 ? a[1] - a[0] : a[0] - a[1];
}
int down(int a, int b) {
  tree[b].flag[0] += tree[a].flag[0];
  tree[b].flag[1] += tree[a].flag[1];
}
int _search(int n, int l, int r, int x) {
  if (l == r) {
    tree[n].v += to(tree[n].flag, l);
    tree[n].z();
    return tree[n].v;
  }
  int mid = (l + r) >> 1;
  int n1 = n << 1, n2 = (n << 1) | 1;
  down(n, n1);
  down(n, n2);
  tree[n].z();
  if (x <= mid)
    return _search(n1, l, mid, x);
  else
    return _search(n2, mid + 1, r, x);
}
void update(int n, int l, int r, int x, int y, int val, int k) {
  if (x <= l && y >= r) {
    tree[n].flag[k] += val;
    return;
  }
  int mid = (l + r) >> 1;
  int n1 = n << 1, n2 = (n << 1) | 1;
  if (x <= mid) update(n1, l, mid, x, y, val, k);
  if (y > mid) update(n2, mid + 1, r, x, y, val, k);
}
int solve(int T) {
  int i, j;
  cin >> n >> m;
  for (i = 1; i <= n; ++i) cin >> v[i];
  for (i = 1; i <= n - 1; ++i) {
    int x, y;
    cin >> x >> y;
    a[x].push_back(y);
    a[y].push_back(x);
  }
  int root = 1;
  dfs(root, -1, 1);
  build(1, 1, n);
  for (i = 1; i <= m; ++i) {
    int flag, x, val;
    cin >> flag;
    if (flag == 1) {
      cin >> x >> val;
      int p = num[x];
      int k = level[p] % 2;
      update(1, 1, n, L[p], R[p], val, k);
    } else {
      cin >> x;
      cout << _search(1, 1, n, num[x]) << '\n';
    }
  }
  return 0;
}
