#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct T_tree {
int l,r,dis;
};
struct T_tree tree[400001];
struct T_edge {
int from,to,next;
};
struct T_edge edge[100001];
struct T_interval {
int li,ri;
};
struct T_interval find_[100001];
int n,m,num_edge=0,head[100001],tot=0;
inline void edge_add(int from,int to)
{
num_edge++;
edge[num_edge].to=to;
edge[num_edge].from=from;
edge[num_edge].next=head[from];
head[from]=num_edge;
}
void dfs(int now)
{
tot++;
find_[now].li=tot;
for(int i=head[now];i;i=edge[i].next)
{
dfs(edge[i].to);
}
find_[now].ri=tot;
}
void tree_up(int now)
{
tree[now].dis=tree[now<<1].dis+tree[now<<1|1].dis;
}
void tree_build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].dis=1;
return ;
}
int mid=(l+r)>>1;
tree_build(now<<1,l,mid);
tree_build(now<<1|1,mid+1,r);
tree_up(now);
return ;
}
void tree_change(int now,int to)
{
if(to==tree[now].l&&tree[now].r==to)
{
if(tree[now].dis) tree[now].dis=0;
else tree[now].dis=1;
return ;
}
int mid=(tree[now].l+tree[now].r)>>1;
if(to>mid) tree_change(now<<1|1,to);
else tree_change(now<<1,to);
tree_up(now);
}
int tree_query(int now,int l,int r)
{
if(tree[now].l==l&&tree[now].r==r)
{
return tree[now].dis;
}
int mid=(tree[now].l+tree[now].r)>>1;
if(l>mid) return tree_query(now<<1|1,l,r);
else if(r<=mid) return tree_query(now<<1,l,r);
else return tree_query(now<<1,l,mid)+tree_query(now<<1|1,mid+1,r);
}
int main()
{
scanf("%d",&n);
int from,to;
for(int i=1;i<n;i++)
{
scanf("%d%d",&from,&to);
edge_add(from,to);
}
dfs(1);
tree_build(1,1,n);
scanf("%d",&m);
char t_do;
int to_ch;
for(int i=1;i<=m;i++)
{
//scanf("%c %d",&t_do,&to_ch);
//scanf("%c",&t_do);
//scanf("%d",&to_ch);
cin>>t_do>>to_ch;
if(t_do==‘Q‘) printf("%d\n",tree_query(1,find_[to_ch].li,find_[to_ch].ri));
else tree_change(1,find_[to_ch].li);
}
return 0;
}