#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#include<tuple>
#include<ctime>
#include<random>
#include<vector>
#include<set>
#if __cplusplus>=202002L
#include<ranges>
namespace vw=std::views;
#endif
#define siz(x) int((x).size())
#define cauto const auto
#define all(x) std::begin(x),std::end(x)
#define rall(x) std::rbegin(x),std::rend(x)
#define sqrt __builtin_sqrt
#define fi first
#define se second
#define continue(x) {x;continue;}
#define break(x) {x;break;}
using std::cin;using std::cout;
using std::max;using std::min;
using std::tie;using std::ignore;
template<typename any>inline void cmin(any &x,const any &y){if(y<x)x=y;}
template<typename any>inline void cmax(any &x,const any &y){if(x<y)x=y;}
template<typename any,typename...args>inline void cmax(any &x,const any &y,const args &...z){cmax(x,y);cmax(x,z...);}
template<typename any,typename...args>inline void cmin(any &x,const any &y,const args &...z){cmin(x,y);cmin(x,z...);}
using loli=long long;
using uloli=unsigned long long;
using lodb=long double;
using venti=__int128_t;
using pii=std::pair<int,int>;
using tiii=std::tuple<int,int,int>;
using inlsi=const std::initializer_list<int>&;
using bsi=std::basic_string<int>;
using bsc=std::string;
using std::operator""s;
#if __cplusplus>=201703L
using bscv=std::string_view;
using std::operator""sv;
#endif
struct _time{~_time(){std::cerr<<"\n\033[33;40m"<<1.*clock()/CLOCKS_PER_SEC<<"s\033[37;40m";}}_TM;
std::mt19937 rng(std::random_device{}());
constexpr venti operator""_vt(uloli x){return venti(x);}
constexpr bool ying=false,yang=true;
constexpr int N=5e5+1;
int n,q,cnt,fa[N],top[N],dfn[N],gs[N],sz[N],dep[N];
bsi g[N];
void dfs1(int u){
for(int v:g[u]){
if(v==fa[u])continue;
fa[v]=u,dep[v]=dep[u]+1,sz[v]=1;
dfs1(v);sz[u]+=sz[v];
if(sz[v]>sz[gs[u]])gs[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t;dfn[u]=++cnt;if(!gs[u])return;else dfs2(gs[u],t);
for(int v:g[u])if(v!=fa[u]&&v!=gs[u])dfs2(v,v);
}
struct odt_node{
int l,r;mutable int val;
odt_node(int a=0,int b=0,int c=0):l(a),r(b),val(c){}
bool operator<(const odt_node &t)const{return l<t.l;}
};
struct:std::set<odt_node>{
auto split(int p){
auto it=lower_bound(p);
if(it!=end()&&it->l==p)return it;
auto t=*--it;erase(it);emplace(t.l,p-1,t.val);
return emplace(p,t.r,t.val).first;
}
auto assign(int l,int r,int k){
erase(split(l),split(r+1));
return emplace(l,r,k).first;
}
}s;
signed main(){
std::ios::sync_with_stdio(false);cin.tie(nullptr);
cin>>n;
for(int i=1,u,v;i<n;i++)cin>>u>>v,g[u]+=v,g[v]+=u;
dfs1(1);dfs2(1,1);
s.emplace(1,n,0);s.emplace(n+1,n+1,0);
cin>>q;
for(int x;q--;)switch(cin>>x,x){
case 1:cin>>x;s.assign(dfn[x],dfn[x]+sz[x]-1,1);break;
case 2:cin>>x;for(;top[x]!=1;x=fa[top[x]])s.assign(dfn[top[x]],dfn[x],0);s.assign(1,dfn[x],0);break;
case 3:cin>>x;cout<<s.split(dfn[x])->val<<'\n';break;
}
return 0;
}