#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200000;
const int MOD = (int)1e9 + 7;
const long long INFI = 1ll << 63 - 1;
struct comp {
  bool operator()(const pair<long long, long long> &a,
                  const pair<long long, long long> &b) {
    if (a.second < b.second) return true;
    return false;
  }
};
bool compa(const pair<long long, long long> &a,
           const pair<long long, long long> &b) {
  if (a.second < b.second) return true;
  return false;
}
int n, m;
vector<int> g[MAXN + 5], A(MAXN + 5);
int FT[2 * MAXN + 5], d[MAXN + 5], f[MAXN + 5], lev[MAXN + 5];
int dt = 0;
void update(int x, int val) {
  while (x < 2 * MAXN + 5) {
    FT[x] += val;
    x += x & (-x);
  }
}
int querry(int x) {
  int ans = 0;
  while (x > 0) {
    ans += FT[x];
    x -= x & (-x);
  }
  return ans;
}
void dfs(int v, int u = 0) {
  d[v] = ++dt;
  for (int i = 0; i < g[v].size(); i++) {
    if (g[v][i] != u) {
      lev[g[v][i]] = lev[v] + 1;
      dfs(g[v][i], v);
    }
  }
  f[v] = ++dt;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> A[i];
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs(1);
  for (int i = 1; i <= m; i++) {
    int type;
    cin >> type;
    if (type == 1) {
      int x, y;
      cin >> x >> y;
      if (lev[x] % 2 == 0) {
        update(d[x], y);
        update(f[x], -y);
      } else {
        update(d[x], -y);
        update(f[x], y);
      }
    } else {
      int x;
      cin >> x;
      if (lev[x] % 2 == 0)
        cout << A[x] + querry(d[x]) << endl;
      else
        cout << A[x] - querry(d[x]) << endl;
    }
  }
  return 0;
}
