#include <bits/stdc++.h>
using namespace std;
bool ans[2000010];
int Time = 0;
int disc[500010];
int lim[500010];
bool mark[500010] = {0};
vector<int> v[500010];
int p[500010];
void propagate(int n, int si, int sj) {
  if (si == sj) return;
  ans[n * 2] = 0;
  ans[n * 2 + 1] = 0;
}
void update(int n, int si, int sj, int st, int en) {
  if (!ans[n]) propagate(n, si, sj);
  if (si > en || sj < st) return;
  if (si >= st && sj <= en) {
    ans[n] = 0;
    return;
  }
  update(n * 2, si, (si + sj) / 2, st, en);
  update(n * 2 + 1, (si + sj) / 2 + 1, sj, st, en);
  ans[n] = (ans[n * 2] || ans[n * 2 + 1]);
}
void update(int n, int si, int sj, int st) {
  if (!ans[n]) propagate(n, si, sj);
  if (si > st || sj < st) return;
  if (si >= st && sj <= st) {
    ans[n] = 1;
    return;
  }
  update(n * 2, si, (si + sj) / 2, st);
  update(n * 2 + 1, (si + sj) / 2 + 1, sj, st);
  ans[n] = (ans[n * 2] || ans[n * 2 + 1]);
}
bool query(int n, int si, int sj, int st, int en) {
  if (!ans[n]) propagate(n, si, sj);
  if (si > en || sj < st) return 0;
  if (si >= st && sj <= en) return ans[n];
  return (query(n * 2, si, (si + sj) / 2, st, en) ||
          query(n * 2 + 1, (si + sj) / 2 + 1, sj, st, en));
}
void go(int cur) {
  mark[cur] = 1;
  disc[cur] = Time++;
  int i;
  for (i = 0; i < v[cur].size(); ++i) {
    if (!mark[v[cur][i]]) {
      p[v[cur][i]] = cur;
      go(v[cur][i]);
    }
  }
  lim[cur] = Time - 1;
}
int main() {
  int n, i, x, y, type, q;
  for (i = 0; i < 2000010; ++i) ans[i] = 1;
  scanf("%d", &n);
  for (i = 0; i < n - 1; ++i) {
    scanf("%d", &x);
    scanf("%d", &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  p[1] = 1;
  go(1);
  scanf("%d", &q);
  while (q--) {
    scanf("%d", &type);
    scanf("%d", &x);
    if (type == 1) {
      if (query(1, 0, n - 1, disc[x], lim[x])) update(1, 0, n - 1, disc[p[x]]);
      update(1, 0, n - 1, disc[x], lim[x]);
    } else if (type == 2)
      update(1, 0, n - 1, disc[x]);
    else
      printf("%d\n", 1 - query(1, 0, n - 1, disc[x], lim[x]));
  }
}
