#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 1;
int n, q, from[N], to[N], T, seg[2][4 * N], lazy[2][4 * N];
vector<int> g[N];
void DFS(int v, int p) {
  from[v] = ++T;
  for (size_t i = 0; i < g[v].size(); ++i)
    if (g[v][i] != p) DFS(g[v][i], v);
  to[v] = T;
}
inline void pro(int p, int l, int r, int T) {
  seg[T][p] = max(seg[T][p], lazy[T][p]);
  if (l != r) {
    lazy[T][p * 2] = max(lazy[T][p * 2], lazy[T][p]);
    lazy[T][p * 2 + 1] = max(lazy[T][p * 2 + 1], lazy[T][p]);
  }
  lazy[T][p] = 0;
}
void update(int p, int l, int r, int at, int v, int T) {
  if (lazy[T][p]) pro(p, l, r, T);
  if (at < l || at > r) return;
  if (l == r) {
    seg[T][p] = max(seg[T][p], v);
    return;
  }
  int m = (l + r) >> 1;
  update(p * 2, l, m, at, v, T);
  update(p * 2 + 1, m + 1, r, at, v, T);
  seg[T][p] = max(seg[T][p * 2], seg[T][p * 2 + 1]);
}
void update(int p, int l, int r, int s, int e, int v, int T) {
  if (lazy[T][p]) pro(p, l, r, T);
  if (l > e || r < s) return;
  if (l >= s && r <= e) {
    lazy[T][p] = v;
    pro(p, l, r, T);
    return;
  }
  int m = (l + r) >> 1;
  update(p * 2, l, m, s, e, v, T);
  update(p * 2 + 1, m + 1, r, s, e, v, T);
  seg[T][p] = max(seg[T][p * 2], seg[T][p * 2 + 1]);
}
int get(int p, int l, int r, int at, int T) {
  if (lazy[T][p]) pro(p, l, r, T);
  if (at < l || at > r) return 0;
  if (l == r) return seg[T][p];
  int m = (l + r) >> 1;
  return max(get(p * 2, l, m, at, T), get(p * 2 + 1, m + 1, r, at, T));
}
int get(int p, int l, int r, int s, int e, int T) {
  if (lazy[T][p]) pro(p, l, r, T);
  if (l > e || r < s) return 0;
  if (l >= s && r <= e) return seg[T][p];
  int m = (l + r) >> 1;
  return max(get(p * 2, l, m, s, e, T), get(p * 2 + 1, m + 1, r, s, e, T));
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  DFS(1, -1);
  scanf("%d", &q);
  for (int i = 1; i <= q; ++i) {
    int t, v;
    scanf("%d%d", &t, &v);
    if (t == 1) {
      update(1, 1, n, from[v], to[v], i, 0);
    } else if (t == 2) {
      update(1, 1, n, from[v], i, 1);
    } else {
      if (get(1, 1, n, from[v], 0) > get(1, 1, n, from[v], to[v], 1))
        puts("1");
      else
        puts("0");
    }
  }
  return 0;
}
