#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
inline istream& operator>>(istream& fin, pair<T1, T2>& pr) {
  fin >> pr.first >> pr.second;
  return fin;
}
template <class T0, class T1, class T2>
inline istream& operator>>(istream& fin, tuple<T0, T1, T2>& t) {
  fin >> get<0>(t) >> get<1>(t) >> get<2>(t);
  return fin;
}
template <class T>
inline istream& operator>>(istream& fin, vector<T>& a) {
  for (auto& u : a) fin >> u;
  return fin;
}
template <class T, size_t n>
inline istream& operator>>(istream& fin, array<T, n>& a) {
  for (auto& u : a) fin >> u;
  return fin;
}
size_t xtag(const size_t u, vector<bool>& tag, vector<vector<size_t>>& adj,
            const size_t chunk) {
  size_t acc = 1;
  for (const auto v : adj[u]) acc += xtag(v, tag, adj, chunk);
  if (acc < chunk) {
    tag[u] = false;
    return acc;
  } else {
    tag[u] = true;
    return 0;
  }
}
void c383() {
  size_t n, m;
  cin >> n >> m;
  vector<int> a(n);
  cin >> a;
  vector<vector<size_t>> adj(n);
  for (size_t i = 0; i + 1 < n; ++i) {
    size_t u, v;
    cin >> u >> v;
    --u;
    --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  vector<size_t> par(n, -1);
  vector<size_t> depth(n, 0);
  queue<size_t> q;
  q.push(0);
  depth[0] = par[0] = 0;
  vector<size_t> ord;
  ord.reserve(n);
  while (!q.empty()) {
    const auto u = q.front();
    q.pop();
    ord.push_back(u);
    for (const auto v : adj[u])
      if (v != par[u]) {
        par[v] = u;
        depth[v] = depth[u] + 1;
        q.push(v);
        *find(begin(adj[v]), end(adj[v]), u) = adj[v].back();
        adj[v].pop_back();
      }
  }
  vector<bool> tag(n, false);
  xtag(0, tag, adj, 1.5 + sqrt(n) / 4);
  vector<size_t> jump(n, -1);
  for (const auto u : ord) jump[u] = tag[par[u]] ? par[u] : jump[par[u]];
  jump[0] = -1;
  vector<int> inc(n, 0);
  for (; 0 < m; --m) {
    size_t op, u;
    cin >> op >> u;
    --u;
    const auto d = depth[u];
    if (op == 1) {
      int val;
      cin >> val;
      queue<size_t> q;
      q.push(u);
      while (!q.empty()) {
        const auto u = q.front();
        q.pop();
        const auto ival = (depth[u] - d) & 1 ? -val : val;
        if (tag[u])
          inc[u] += ival;
        else {
          a[u] += ival;
          for (const auto v : adj[u]) q.push(v);
        }
      }
    } else {
      int val = a[u] + inc[u];
      for (u = jump[u]; u != (size_t)-1; u = jump[u])
        val += (d - depth[u]) & 1 ? -inc[u] : inc[u];
      cout << val << '\n';
    }
  }
}
int main(const int argc, char* argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  c383();
  return EXIT_SUCCESS;
}
