#include <bits/stdc++.h>
using namespace std;
const int maxn = 500005;
struct node {
  int left, right;
  bool data, lazy;
} T[maxn << 2];
int L[maxn], R[maxn], par[maxn], idx;
vector<int> E[maxn];
void dfs(int x, int fa) {
  par[x] = fa;
  L[x] = ++idx;
  for (int i = 0; i < E[x].size(); i++) {
    int u = E[x][i];
    if (u != fa) dfs(u, x);
  }
  R[x] = idx;
}
void build(int l, int r, int t) {
  T[t].left = l;
  T[t].right = r;
  T[t].data = 0;
  T[t].lazy = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid, (t << 1));
  build(mid + 1, r, (t << 1) | 1);
}
void LAZY(int t) {
  if (T[t].lazy) {
    T[(t << 1)].data = T[(t << 1) | 1].data = T[(t << 1)].lazy =
        T[(t << 1) | 1].lazy = 1;
    T[t].lazy = 0;
  }
}
void update(int l, int r, int x, int t) {
  if (T[t].left == l && T[t].right == r) {
    T[t].data = x;
    T[t].lazy = 1;
    return;
  }
  LAZY(t);
  if (r <= T[(t << 1)].right) {
    update(l, r, x, (t << 1));
  } else if (l >= T[(t << 1) | 1].left) {
    update(l, r, x, (t << 1) | 1);
  } else {
    update(l, T[(t << 1)].right, x, (t << 1));
    update(T[(t << 1) | 1].left, r, x, (t << 1) | 1);
  }
  T[t].data = T[(t << 1)].data & T[(t << 1) | 1].data;
}
bool query(int l, int r, int t) {
  if (T[t].left == l && T[t].right == r) {
    return T[t].data;
  }
  LAZY(t);
  if (r <= T[(t << 1)].right) {
    return query(l, r, (t << 1));
  } else if (l >= T[(t << 1) | 1].left) {
    return query(l, r, (t << 1) | 1);
  } else {
    return query(l, T[(t << 1)].right, (t << 1)) &
           query(T[(t << 1) | 1].left, r, (t << 1) | 1);
  }
}
int main() {
  int n, x, y;
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d", &x, &y);
    E[x].push_back(y);
    E[y].push_back(x);
  }
  idx = 0;
  dfs(1, 0);
  build(1, idx, 1);
  int q, c, v;
  scanf("%d", &q);
  while (q--) {
    scanf("%d%d", &c, &v);
    if (c == 1) {
      bool flag = query(L[v], R[v], 1);
      if (flag == 0) update(L[par[v]], L[par[v]], 0, 1);
      update(L[v], R[v], 1, 1);
    } else if (c == 2) {
      update(L[v], L[v], 0, 1);
    } else {
      printf("%d\n", query(L[v], R[v], 1) ? 1 : 0);
    }
  }
  return 0;
}
