#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
pair<long long int, long long int> p[N];
vector<long long int> v[N];
long long int crt = 0, level[N];
struct ft {
  vector<long long int> bit;
  long long int n;
  ft() {
    n = 2 * N + 5;
    bit.assign(n, 0);
  }
  long long int sum(long long int r) {
    long long int ret = 0;
    for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r];
    return ret;
  }
  void add(long long int idx, long long int d) {
    for (; idx < n; idx = idx | (idx + 1)) bit[idx] += d;
  }
  long long int sum(long long int l, long long int r) {
    return sum(r) - sum(l - 1);
  }
};
void dfs(long long int id, long long int p1, long long int l) {
  level[id] = l;
  p[id].first = crt++;
  for (auto X : v[id]) {
    if (X != p1) {
      dfs(X, id, l + 1);
    }
  }
  p[id].second = crt++;
}
void solve() {
  long long int n, q;
  cin >> n >> q;
  ft ft1[2];
  long long int a[n + 1];
  for (long long int i = 1; i <= n; i++) cin >> a[i];
  for (long long int i = 0; i < n - 1; i++) {
    long long int x, y;
    cin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1, 0, 0);
  while (q--) {
    long long int type;
    cin >> type;
    if (type == 1) {
      long long int node, value;
      cin >> node >> value;
      long long int l = level[node] % 2;
      ft1[l].add(p[node].first, value);
      ft1[l].add(p[node].second + 1, -value);
      l ^= 1;
      ft1[l].add(p[node].first, -value);
      ft1[l].add(p[node].second + 1, value);
    } else {
      long long int node;
      cin >> node;
      long long int l = level[node] % 2;
      long long int ans = a[node] + ft1[l].sum(p[node].first);
      cout << ans << "\n";
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  srand(time(NULL));
  ;
  long long int t = 1;
  while (t--) {
    solve();
  }
}
