#include <bits/stdc++.h>
using namespace std;

struct SegTree {
  vector<int> node, lazy;
  
  SegTree(int n) : node(n << 1), lazy(n << 1) {}
  
  void update(int i, int l, int r, int a, int b, int v) {
    if (l > b || r < a) {
      return;
    } else if (l >= a && r <= b) {
      return flip(i, v);
    }
    int m = (l + r) >> 1;
    int x = i + 1;
    int y = i + ((m - l + 1) << 1);
    propagate(i, x, y);
    update(x, l, m + 0, a, b, v);
    update(y, m + 1, r, a, b, v);
    node[i] = node[x] ^ node[y];
  }
  
  void flip(int i, int v) {
    node[i] ^= v;
    lazy[i] ^= v;
  }
  
  void propagate(int i, int x, int y) {
    flip(x, lazy[i]);
    flip(y, lazy[i]);
    lazy[i] = 0;
  }
  
  int query(int i, int l, int r, int a, int b) {
    if (l > b || r < a) {
      return 0;
    } else if (l >= a && r <= b) {
      return node[i];
    }
    int m = (l + r) >> 1;
    int x = i + 1;
    int y = i + ((m - l + 1) << 1);
    propagate(i, x, y);
    return query(x, l, m + 0, a, b) ^ query(y, m + 1, r, a, b);
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, q;
  cin >> n;
  vector<vector<int>> adj(n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  int timer = -1;
  vector<int> in(n), out(n);
  function<void(int, int)> dfs = [&](int u, int p) {
    in[u] = ++timer;
    for (int v : adj[u]) {
      if (v != p) {
        dfs(v, u);
      }
    }
    out[u] = ++timer;
  };
  dfs(0, -1);
  SegTree tree(out[0] + 1);
  cin >> q;
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int u, v;
      cin >> u >> v;
      --u;
      tree.update(0, in[0], out[0], in[u], out[u], v);
    } else {
      int u;
      cin >> u;
      --u;
      cout << tree.query(0, in[0], out[0], in[0], in[u]) << "\n";
    }
  }
  return 0;
}
