#include <bits/stdc++.h>
#define ll long long
const ll MAXN=5e5;
using namespace std;
ll n,q,tin[MAXN+5],tout[MAXN+5],cur=0,par[MAXN+5];
vector<ll> adj[MAXN+5];
void dfs(ll u){
    tin[u]=++cur;
    for(ll v:adj[u]){
        if(v==par[u]) continue;
        par[v]=u;
        dfs(v);
    }
    tout[u]=cur;
}
ll t[4*MAXN+5],lazy[4*MAXN+5];
void push(ll v,ll l,ll r){
    if(lazy[v]==1e18) return;
    ll m=(l+r)/2;
    t[2*v]=(m-l+1)*lazy[v];
    lazy[2*v]=lazy[v];
    t[2*v+1]=(r-m)*lazy[v];
    lazy[2*v+1]=lazy[v];
    lazy[v]=1e18;
}
void update(ll v,ll tl,ll tr,ll l,ll r,ll val){
    if(l>r || l==0) return;
    if(tl==l && tr==r){
        t[v]=(r-l+1)*val;
        lazy[v]=val;
    }
    else{
        push(v,tl,tr);
        ll tm=(tl+tr)/2;
        update(2*v,tl,tm,l,min(r,tm),val);
        update(2*v+1,tm+1,tr,max(l,tm+1),r,val);
        t[v]=t[2*v]+t[2*v+1];
    }
}
ll query(ll v,ll tl,ll tr,ll l,ll r){
    if(l>r) return 0;
    if(tl==l && tr==r) return t[v];
    else{
        push(v,tl,tr);
        ll tm=(tl+tr)/2;
        return query(2*v,tl,tm,l,min(r,tm))+query(2*v+1,tm+1,tr,max(l,tm+1),r);
    }
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    if(fopen("skibidi.inp","r")){
        freopen("skibidi.inp","r",stdin);
        freopen("skibidi.out","w",stdout);
    }
    cin>>n;
    for(int i=1;i<n;i++){
        ll u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(1);
    for(int i=0;i<=4*MAXN;i++) lazy[i]=1e18;
    cin>>q;
    while(q--){
        ll type,u;
        cin>>type>>u;
        if(type==1){
            ll sum=query(1,1,n,tin[u],tout[u]);
            if(sum!=(tout[u]-tin[u]+1)) update(1,1,n,tin[par[u]],tin[par[u]],0);
            update(1,1,n,tin[u],tout[u],1);
        }
        else if(type==2){
            update(1,1,n,tin[u],tin[u],0);
        }
        else{
            ll sum=query(1,1,n,tin[u],tout[u]);
            if(sum!=(tout[u]-tin[u]+1)) cout<<0;
            else cout<<1;
            cout<<'\n';
        }
    }
    return 0;
}
