#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000033;
struct Edge {
  int nx, to;
} E[MAXN << 1];
int first[MAXN], ecnt = 1;
inline void addedge(int u, int v) {
  ++ecnt;
  E[ecnt].nx = first[u];
  E[ecnt].to = v;
  first[u] = ecnt;
}
int n;
int Dcnt;
int L[MAXN], R[MAXN];
void dfs(int x, int fa) {
  L[x] = ++Dcnt;
  for (int i = first[x]; i; i = E[i].nx) {
    int to = E[i].to;
    if (to == fa) continue;
    dfs(to, x);
  }
  R[x] = Dcnt;
}
struct Segnode {
  int l, r;
  int lastempty, lastfill;
  int flag;
} T[MAXN << 2];
int TIME;
void build(int id, int l, int r) {
  T[id].l = l, T[id].r = r;
  T[id].lastfill = -1, T[id].lastempty = 0;
  T[id].flag = 0;
  if (l == r) return;
  int mid = (l + r) / 2;
  build((id << 1), l, mid);
  build((id << 1 | 1), mid + 1, r);
}
inline void PushUp(int id) {
  T[id].lastfill = max(T[(id << 1)].lastfill, T[(id << 1 | 1)].lastfill);
  T[id].lastempty = max(T[(id << 1)].lastempty, T[(id << 1 | 1)].lastempty);
}
inline void operate_(int id) {
  T[id].lastfill = T[id].flag;
  T[(id << 1)].lastfill = T[id].flag;
  T[(id << 1 | 1)].lastfill = T[id].flag;
}
inline void PushDown(int id) {
  if (T[id].flag) {
    T[(id << 1)].flag = T[id].flag;
    T[(id << 1 | 1)].flag = T[id].flag;
    operate_(id);
    T[id].flag = 0;
  }
}
void Fill(int id, int l, int r) {
  if (T[id].l == l && T[id].r == r) {
    T[id].lastfill = TIME;
    T[id].flag = TIME;
    operate_(id);
    return;
  }
  PushDown(id);
  int mid = (T[id].l + T[id].r) / 2;
  if (r <= mid)
    Fill((id << 1), l, r);
  else if (l > mid)
    Fill((id << 1 | 1), l, r);
  else
    Fill((id << 1), l, mid), Fill((id << 1 | 1), mid + 1, r);
  PushUp(id);
}
void Empty(int id, int pos) {
  if (T[id].l == T[id].r) {
    T[id].lastempty = TIME;
    return;
  }
  PushDown(id);
  int mid = (T[id].l + T[id].r) / 2;
  if (pos <= mid)
    Empty((id << 1), pos);
  else
    Empty((id << 1 | 1), pos);
  PushUp(id);
}
int queryEmpty(int id, int l, int r) {
  if (T[id].l == l && T[id].r == r) {
    return T[id].lastempty;
  }
  PushDown(id);
  int mid = (T[id].l + T[id].r) / 2;
  if (r <= mid)
    return queryEmpty((id << 1), l, r);
  else if (l > mid)
    return queryEmpty((id << 1 | 1), l, r);
  else
    return max(queryEmpty((id << 1), l, mid),
               queryEmpty((id << 1 | 1), mid + 1, r));
}
int queryFill(int id, int l, int r) {
  if (T[id].l == l && T[id].r == r) {
    return T[id].lastfill;
  }
  PushDown(id);
  int mid = (T[id].l + T[id].r) / 2;
  if (r <= mid)
    return queryFill((id << 1), l, r);
  else if (l > mid)
    return queryFill((id << 1 | 1), l, r);
  else
    return max(queryFill((id << 1), l, mid),
               queryFill((id << 1 | 1), mid + 1, r));
}
int main() {
  int u, v;
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> n;
  for (int i = 1; i < n; i++) {
    cin >> u >> v;
    addedge(u, v);
    addedge(v, u);
  }
  dfs(1, 0);
  int q;
  build(1, 1, n);
  cin >> q;
  int op, x;
  while (q--) {
    ++TIME;
    cin >> op >> x;
    if (op == 3) {
      int eid = queryEmpty(1, L[x], R[x]);
      int fid = queryFill(1, L[x], L[x]);
      if (fid > eid)
        puts("1");
      else
        puts("0");
    } else if (op == 2) {
      Empty(1, L[x]);
    } else {
      Fill(1, L[x], R[x]);
    }
  }
  return 0;
}
