#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500 * 1000 + 10;
vector<int> vec[MAXN];
bool mark[MAXN];
int st[MAXN], fi[MAXN], seg1[MAXN * 4], seg2[MAXN * 4];
int t = 0;
void dfs(int v) {
  mark[v] = true;
  st[v] = t;
  t++;
  for (int i = 0; i < (int)vec[v].size(); i++)
    if (!mark[vec[v][i]]) dfs(vec[v][i]);
  fi[v] = t;
}
void upd(int l, int r, int val, int v, int s, int e) {
  if (e - s <= 1 || (l <= s && e <= r)) {
    seg1[v] = val;
    return;
  }
  int m = (e + s) / 2;
  if (l < m) upd(l, r, val, v * 2, s, m);
  if (m < r) upd(l, r, val, v * 2 + 1, m, e);
}
int get(int p, int v, int s, int e) {
  if (e - s <= 1) return seg1[v];
  int m = (s + e) / 2;
  if (p < m)
    return max(seg1[v], get(p, v * 2, s, m));
  else
    return max(seg1[v], get(p, v * 2 + 1, m, e));
}
void upd(int p, int val, int v, int s, int e) {
  if (e - s <= 1) {
    seg2[v] = val;
    return;
  }
  int m = (s + e) / 2;
  if (p < m)
    upd(p, val, v * 2, s, m);
  else
    upd(p, val, v * 2 + 1, m, e);
  seg2[v] = max(seg2[v * 2], seg2[v * 2 + 1]);
}
int get(int l, int r, int v, int s, int e) {
  if (e - s <= 1 || (l <= s && e <= r)) return seg2[v];
  int m = (e + s) / 2;
  int a = 0;
  if (l < m) a = max(a, get(l, r, v * 2, s, m));
  if (m < r) a = max(a, get(l, r, v * 2 + 1, m, e));
  return a;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    vec[a].push_back(b);
    vec[b].push_back(a);
  }
  dfs(0);
  int q;
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    int t, v;
    scanf("%d %d", &t, &v);
    v--;
    if (t == 1)
      upd(st[v], fi[v], i + 1, 1, 0, n);
    else if (t == 2)
      upd(st[v], i + 1, 1, 0, n);
    else {
      int fill = get(st[v], 1, 0, n);
      int empty = get(st[v], fi[v], 1, 0, n);
      if (fill > empty)
        printf("1\n");
      else
        printf("0\n");
    }
  }
}
