#include <bits/stdc++.h>
using namespace std;
const int N = 200001;
int n, m, t, l, r, x, v, id = 1, out[N], in[N], cost[N], a[N];
int seg[4 * N], lazy[4 * N], lazy1[4 * N], seg1[4 * N];
vector<int> g[N];
void dfs(int node, int p) {
  in[node] = id;
  id++;
  for (int i = 0; i < g[node].size(); i++) {
    if (g[node][i] != p) dfs(g[node][i], node);
  }
  out[node] = id - 1;
}
void bfs(int node) {
  queue<int> q;
  cost[node] = 0;
  q.push(node);
  while (q.empty() == false) {
    int cur = q.front();
    q.pop();
    for (int i = 0; i < g[cur].size(); i++) {
      if (cost[g[cur][i]] == -1) {
        cost[g[cur][i]] = cost[cur] + 1;
        q.push(g[cur][i]);
      }
    }
  }
}
void push(int p, int l, int r) {
  seg[p] += (r - l + 1) * lazy[p];
  if (l != r) {
    lazy[p * 2] += lazy[p];
    lazy[p * 2 + 1] += lazy[p];
  }
  lazy[p] = 0;
}
void update(int p, int l, int r, int a, int b, int v) {
  push(p, l, r);
  if (r < a || l > b) return;
  if (a <= l && r <= b) {
    lazy[p] = v;
    push(p, l, r);
    return;
  }
  int mid = (l + r) / 2;
  update(p * 2, l, mid, a, b, v);
  update(p * 2 + 1, mid + 1, r, a, b, v);
  seg[p] = seg[p * 2] + seg[p * 2 + 1];
}
long long int get(int p, int l, int r, int a, int b) {
  push(p, l, r);
  if (r < a || l > b) return 0;
  if (l >= a && r <= b) return seg[p];
  int mid = (l + r) / 2;
  return get(p * 2, l, mid, a, b) + get(p * 2 + 1, mid + 1, r, a, b);
}
void push1(int p, int l, int r) {
  seg1[p] += (r - l + 1) * lazy1[p];
  if (l != r) {
    lazy1[p * 2] += lazy1[p];
    lazy1[p * 2 + 1] += lazy1[p];
  }
  lazy1[p] = 0;
}
void update1(int p, int l, int r, int a, int b, int v) {
  push1(p, l, r);
  if (r < a || l > b) return;
  if (a <= l && r <= b) {
    lazy1[p] = v;
    push1(p, l, r);
    return;
  }
  int mid = (l + r) / 2;
  update1(p * 2, l, mid, a, b, v);
  update1(p * 2 + 1, mid + 1, r, a, b, v);
  seg1[p] = seg1[p * 2] + seg1[p * 2 + 1];
}
long long int get1(int p, int l, int r, int a, int b) {
  push1(p, l, r);
  if (r < a || l > b) return 0;
  if (l >= a && r <= b) return seg1[p];
  int mid = (l + r) / 2;
  return get1(p * 2, l, mid, a, b) + get1(p * 2 + 1, mid + 1, r, a, b);
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int x, y, i = 0; i < n - 1; i++) {
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  memset(cost, -1, sizeof cost);
  dfs(1, -1);
  bfs(1);
  while (m--) {
    cin >> t;
    if (t == 1) {
      cin >> x >> v;
      if (cost[x] % 2 == 0) {
        update(1, 1, n, in[x], out[x], v);
        update1(1, 1, n, in[x], out[x], -v);
      } else {
        update1(1, 1, n, in[x], out[x], v);
        update(1, 1, n, in[x], out[x], -v);
      }
    } else {
      cin >> x;
      if (cost[x] % 2 == 0)
        cout << a[x] + get(1, 1, n, in[x], in[x]) << '\n';
      else
        cout << a[x] + get1(1, 1, n, in[x], in[x]) << '\n';
    }
  }
  return 0;
}
