#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 10;
typedef int i_N[maxN];
int N, M;
i_N A;
int ITodd[maxN * 4], ITeven[maxN * 4];
namespace graph {
int Cnum;
i_N num, hi, P, depth;
vector<int> adj[maxN];
void link(const int u, const int v) { adj[u].push_back(v); }
void DFS(const int u) {
  num[u] = hi[u] = ++Cnum;
  for (int i = 0; i < (int)adj[u].size(); i++) {
    const int v = adj[u][i];
    if (P[v]) continue;
    P[v] = u;
    depth[v] = depth[u] + 1;
    DFS(v);
    hi[u] = max(hi[u], hi[v]);
  }
}
}  // namespace graph
void update(int *IT, const int key, const int l, const int r, const int i,
            const int j, const int val) {
  if (j < l || i > r) return;
  if (i <= l && j >= r) {
    IT[key] += val;
    return;
  }
  const int mid = (l + r) / 2;
  update(IT, key * 2, l, mid, i, j, val);
  update(IT, key * 2 + 1, mid + 1, r, i, j, val);
}
int get_IT(int *IT, const int key, const int l, const int r, const int i) {
  if (i < l || i > r) return 0;
  int tmp = IT[key];
  if (l == r) return tmp;
  const int mid = (l + r) / 2;
  return get_IT(IT, key * 2, l, mid, i) +
         get_IT(IT, key * 2 + 1, mid + 1, r, i) + tmp;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M;
  for (int i = 0; i < N; i++) cin >> A[i + 1];
  for (int i = 0; i < N - 1; i++) {
    int u, v;
    cin >> u >> v;
    graph::link(u, v);
    graph::link(v, u);
  }
  graph::P[1] = -1;
  graph::DFS(1);
  {
    using namespace graph;
    for (int i = 0; i < M; i++) {
      using namespace graph;
      int cmd, u, val;
      cin >> cmd;
      if (cmd == 1) {
        cin >> u >> val;
        int *x = ITeven, *y = ITodd;
        if (depth[u] % 2) swap(x, y);
        update(x, 1, 1, N, num[u], hi[u], val);
        update(y, 1, 1, N, num[u], hi[u], -val);
      } else {
        cin >> u;
        int *x = (depth[u] % 2) ? ITodd : ITeven;
        int ans = get_IT(x, 1, 1, N, num[u]);
        cout << ans + A[u] << endl;
      }
    }
  }
}
