#include <bits/stdc++.h>
using namespace std;
int A[400000 + 5], tin[400000 + 5], tout[400000 + 5], L[400000 + 5],
    valor[400000 + 5];
int temp = 0;
vector<int> adj[400000 + 5];
struct nodo {
  int par, imp;
  nodo(int a, int b) { par = a, imp = b; };
  nodo() {}
};
nodo tree[4 * 400000 + 5];
int flagp[4 * 400000 + 5], flagi[4 * 400000 + 5];
void dfs(int u, int niv) {
  L[u] = niv;
  valor[temp] = u;
  tin[u] = temp++;
  int sz = adj[u].size();
  for (int i = 0; i < sz; ++i) {
    int v = adj[u][i];
    if (tin[v] == -1) dfs(v, niv + 1);
  }
  valor[temp] = u;
  tout[u] = temp++;
}
void init(int u, int a, int b) {
  if (a == b) {
    int val = valor[a];
    if (L[val] & 1)
      tree[u].imp = A[val];
    else
      tree[u].par = A[val];
    return;
  }
  int v1 = 2 * u + 1, v2 = 2 * u + 2;
  init(v1, a, (a + b) / 2);
  init(v2, (a + b) / 2 + 1, b);
}
void push(int u, int a, int b) {
  if (a != b) {
    int v1 = 2 * u + 1, v2 = 2 * u + 2;
    flagp[v1] += flagp[u], flagi[v1] += flagi[u];
    flagp[v2] += flagp[u], flagi[v2] += flagi[u];
  } else
    tree[u].par += flagp[u], tree[u].imp += flagi[u];
  flagp[u] = 0, flagi[u] = 0;
}
void update(int u, int a, int b, int p, int q, int val, int tipo) {
  push(u, a, b);
  if (a > q || b < p) return;
  if (a >= p && b <= q) {
    if (!tipo)
      flagp[u] += val;
    else
      flagi[u] += val;
    push(u, a, b);
    return;
  }
  int v1 = 2 * u + 1, v2 = 2 * u + 2;
  update(v1, a, (a + b) / 2, p, q, val, tipo);
  update(v2, (a + b) / 2 + 1, b, p, q, val, tipo);
}
int query(int u, int a, int b, int p) {
  if (a > p || b < p) return 0;
  push(u, a, b);
  if (a == b) {
    int val = valor[a];
    if (L[val] & 1) return tree[u].imp;
    return tree[u].par;
  }
  int v1 = 2 * u + 1, v2 = 2 * u + 2;
  return query(v1, a, (a + b) / 2, p) + query(v2, (a + b) / 2 + 1, b, p);
}
int main() {
  int n, m, x, y;
  int c, val;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < 2 * n; ++i) tin[i] = -1;
  for (int i = 0; i < n; ++i) scanf("%d", &A[i]);
  for (int i = 0; i < n - 1; ++i) {
    scanf("%d%d", &x, &y);
    x--, y--;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  dfs(0, 0);
  init(0, 0, 2 * n - 1);
  for (int i = 0; i < m; ++i) {
    scanf("%d", &c);
    if (c == 1) {
      scanf("%d%d", &x, &val);
      x--;
      if (L[x] & 1)
        update(0, 0, 2 * n - 1, tin[x], tout[x], val, 1),
            update(0, 0, 2 * n - 1, tin[x], tout[x], -val, 0);
      else
        update(0, 0, 2 * n - 1, tin[x], tout[x], val, 0),
            update(0, 0, 2 * n - 1, tin[x], tout[x], -val, 1);
    } else {
      scanf("%d", &x);
      x--;
      int res = query(0, 0, 2 * n - 1, tin[x]);
      printf("%d\n", res);
    }
  }
}
