#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 1;
static int n, m, pos = 0;
struct Range {
  int l, r;
};
struct Node {
  int l, r, v, c;
};
int a[N], pt[N];
bool vis[N], attr[N];
Range range[N];
Node data[N * 4], datb[N * 4];
vector<int> edge[N], elem[2];
void dfs(const int u = 1, const bool flag = true) {
  range[u].l = pos;
  vis[u] = true;
  pt[pos] = u;
  attr[u] = flag;
  pos++;
  for (int i = 0; i < edge[u].size(); i++)
    if (!vis[edge[u][i]]) {
      dfs(edge[u][i], !flag);
    }
  range[u].r = pos;
}
void build(Node* node, const int l, const int r, const int k = 0) {
  node[k].l = l;
  node[k].r = r;
  node[k].c = 0;
  if (l + 1 == r) {
    node[k].v = a[pt[l]];
  } else {
    build(node, l, (l + r) / 2, k * 2 + 1);
    build(node, (l + r) / 2, r, k * 2 + 2);
  }
}
void update(Node* node, const int x, const int l, const int r,
            const int k = 0) {
  if (l <= node[k].l && node[k].r <= r) {
    node[k].c += x;
  } else if (node[k].l < r && node[k].r > l) {
    update(node, x, l, r, k * 2 + 1);
    update(node, x, l, r, k * 2 + 2);
  }
}
int query(const Node* node, const int p, const int k = 0) {
  if (node[k].l + 1 == node[k].r && node[k].l == p) {
    return node[k].v + node[k].c;
  } else if (p < node[k].l || p >= node[k].r) {
    return 0;
  } else {
    return query(node, p, k * 2 + 1) + query(node, p, k * 2 + 2) + node[k].c;
  }
}
void show() {
  printf("show:");
  for (int u = 1; u <= n; u++) {
    if (attr[u]) {
      printf(" %d", query(data, range[u].l));
    } else {
      printf(" %d", query(datb, range[u].l));
    }
  }
  printf("\n");
}
int main() {
  int u, v, t, x;
  while (scanf("%d%d", &n, &m) != EOF) {
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 0; i < n - 1; i++) {
      scanf("%d%d", &u, &v);
      edge[u].push_back(v);
      edge[v].push_back(u);
    }
    dfs();
    build(data, 0, n);
    build(datb, 0, n);
    for (int i = 0; i < m; i++) {
      scanf("%d", &t);
      if (t == 1) {
        scanf("%d%d", &v, &x);
        if (attr[v]) {
          update(data, x, range[v].l, range[v].r);
          update(datb, -x, range[v].l, range[v].r);
        } else {
          update(datb, x, range[v].l, range[v].r);
          update(data, -x, range[v].l, range[v].r);
        }
      } else {
        scanf("%d", &v);
        if (attr[v])
          printf("%d\n", query(data, range[v].l));
        else
          printf("%d\n", query(datb, range[v].l));
      }
    }
  }
  return 0;
}
