#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, val;
  node *lc, *rc;
};
node *makeNode(int l, int r) {
  node *R = (node *)malloc(sizeof(node));
  R->l = l, R->r = r;
  R->lc = R->rc = NULL;
  R->val = 0;
  return R;
}
int N, M, A[200005], D[200005], T[200005], lo[200005], hi[200005], H;
vector<int> edge[200005];
bool vst[200005];
node *Even, *Odd;
void traversal(int node) {
  vst[node] = true;
  T[++H] = node;
  lo[node] = H;
  for (int i = 0; i < edge[node].size(); i++) {
    int nxt = edge[node][i];
    if (vst[nxt]) continue;
    D[nxt] = D[node] + 1;
    traversal(nxt);
  }
  hi[node] = H;
}
void maketree(node *cur) {
  if (cur->l == cur->r) return;
  int mid = (cur->l + cur->r) / 2;
  cur->lc = makeNode(cur->l, mid);
  cur->rc = makeNode(mid + 1, cur->r);
  maketree(cur->lc);
  maketree(cur->rc);
}
void update(node *cur, int left, int right, int val) {
  if (left <= cur->l && cur->r <= right) {
    cur->val += val;
    return;
  }
  int mid = (cur->l + cur->r) / 2;
  if (left <= mid) update(cur->lc, left, right, val);
  if (right > mid) update(cur->rc, left, right, val);
}
int answer(node *cur, int index) {
  int mid = (cur->l + cur->r) / 2;
  if (cur->l == cur->r) return cur->val;
  if (index <= mid)
    return answer(cur->lc, index) + cur->val;
  else
    return answer(cur->rc, index) + cur->val;
}
int main(void) {
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= N; i++) scanf("%d", &A[i]);
  for (int i = 1; i < N; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    edge[v].push_back(u);
    edge[u].push_back(v);
  }
  D[1] = 1;
  traversal(1);
  Even = makeNode(1, N);
  Odd = makeNode(1, N);
  maketree(Even);
  maketree(Odd);
  for (int i = 1; i <= M; i++) {
    int query, x;
    scanf("%d %d", &query, &x);
    if (query == 1) {
      int val;
      scanf("%d", &val);
      A[x] += val;
      if (lo[x] < hi[x]) {
        int vl = val;
        if (D[x] & 1) vl *= -1;
        update(Even, lo[x] + 1, hi[x], vl);
        update(Odd, lo[x] + 1, hi[x], -vl);
      }
    } else {
      int add = (D[x] & 1) ? answer(Odd, lo[x]) : answer(Even, lo[x]);
      printf("%d\n", A[x] + add);
    }
  }
  return 0;
}
