#include <bits/stdc++.h>
using namespace std;
const int MAX = 2e5 + 5;
vector<int> adj[MAX];
int a[MAX], h[MAX];
int lazy[2][4 * MAX];
int tree[4 * MAX];
int rng[MAX][2];
int s[2][MAX];
int ind[MAX];
int id[MAX];
int cnt;
void dfs(int u, int p) {
  id[u] = ++cnt;
  ind[cnt] = u;
  rng[u][0] = cnt;
  h[u] = 1 - h[p];
  for (auto v : adj[u])
    if (v != p) dfs(v, u);
  rng[u][1] = cnt;
}
void build(int no, int i, int j) {
  if (i == j) {
    tree[no] = a[ind[i]];
    return;
  }
  build(no * 2, i, (i + j) / 2);
  build(no * 2 + 1, (i + j) / 2 + 1, j);
  tree[no] = tree[no * 2] + tree[no * 2 + 1];
}
int query(int l, int r, int k) { return s[k][r] - s[k][l - 1]; }
void propagate(int no, int i, int j, int k) {
  if (!lazy[k][no]) return;
  tree[no] += lazy[k][no] * query(i, j, k);
  tree[no] -= lazy[k][no] * query(i, j, 1 - k);
  if (i != j) {
    lazy[k][no * 2] += lazy[k][no];
    lazy[k][no * 2 + 1] += lazy[k][no];
  }
  lazy[k][no] = 0;
}
void update(int no, int i, int j, int l, int r, int k, int x) {
  propagate(no, i, j, 0);
  propagate(no, i, j, 1);
  if (i > r || j < l) return;
  if (i >= l && j <= r) {
    lazy[k][no] += x;
    propagate(no, i, j, 0);
    propagate(no, i, j, 1);
    return;
  }
  update(no * 2, i, (i + j) / 2, l, r, k, x);
  update(no * 2 + 1, (i + j) / 2 + 1, j, l, r, k, x);
  tree[no] = tree[no * 2] + tree[no * 2 + 1];
}
int query(int no, int i, int j, int p) {
  propagate(no, i, j, 0);
  propagate(no, i, j, 1);
  if (i > p || j < p) return 0;
  if (i == j) return tree[no];
  return query(no * 2, i, (i + j) / 2, p) +
         query(no * 2 + 1, (i + j) / 2 + 1, j, p);
}
int main(int argc, char** argv) {
  int N, M, op, u, v;
  scanf("%d%d", &N, &M);
  for (int i = (1); i <= (N); i++) scanf("%d", a + i);
  for (int i = (1); i < (N); i++) {
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1, 1);
  build(1, 1, N);
  for (int i = (1); i <= (N); i++) s[0][i] = s[0][i - 1] + (h[ind[i]] == 0);
  for (int i = (1); i <= (N); i++) s[1][i] = s[1][i - 1] + (h[ind[i]] == 1);
  for (int m = (0); m < (M); m++) {
    scanf("%d%d", &op, &u);
    if (op == 1) {
      scanf("%d", &v);
      update(1, 1, N, rng[u][0], rng[u][1], h[u], v);
    } else
      printf("%d\n", query(1, 1, N, rng[u][0]));
  }
  return 0;
}
