#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> lin[250000];
int in[250000];
int out[250000];
int tree[800002];
int an;
int v[250000];
int idd[250000];
int Q;
int num = 0;
void push_down(int id) {
  tree[(id * 2 + 1)] += tree[id];
  tree[(id * 2)] += tree[id];
  tree[id] = 0;
}
void dfs(int x, int pre, int id) {
  idd[x] = id;
  in[x] = ++num;
  for (int i = 0; i < lin[x].size(); i++) {
    if (lin[x][i] != pre) dfs(lin[x][i], x, -id);
  }
  out[x] = num;
}
void add(int id, int l, int r, int L, int R, int V) {
  if (l > R || r < L) return;
  if (l >= L && r <= R) {
    tree[id] += V;
    return;
  }
  push_down(id);
  int mid = (l + r) >> 1;
  add((id * 2), l, mid, L, R, V);
  add((id * 2 + 1), mid + 1, r, L, R, V);
}
void query(int id, int l, int r, int L, int R) {
  if (l > R || r < L) return;
  if (l >= L && r <= R) {
    an = tree[id];
    return;
  }
  push_down(id);
  int mid = (l + r) >> 1;
  query((id * 2), l, mid, L, R);
  query((id * 2 + 1), mid + 1, r, L, R);
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++) scanf("%d", &v[i]);
  for (int i = 1; i < n; i++) {
    int aa, bb;
    scanf("%d%d", &aa, &bb);
    lin[aa].push_back(bb);
    lin[bb].push_back(aa);
  }
  dfs(1, 0, 1);
  for (int i = 1; i <= Q; i++) {
    int aa;
    scanf("%d", &aa);
    if (aa == 1) {
      int bb;
      int vv;
      scanf("%d%d", &bb, &vv);
      if (idd[bb] == -1) vv = -vv;
      add(1, 1, n, in[bb], out[bb], vv);
    } else if (aa == 2) {
      int bb;
      scanf("%d", &bb);
      an = 0;
      query(1, 1, n, in[bb], in[bb]);
      an = an * idd[bb] + v[bb];
      printf("%d\n", an);
    }
  }
}
