#include <iostream>
#include <stdio.h>
#include <string.h>
#define ls t<<1
#define rs t<<1|1
#define midt
(tr[t].l+tr[t].r)>>1
using namespace std;
const int maxn=100001+100;
int head[maxn],lon;
int a[maxn];
struct
{
int to,next;
}e[maxn<<2];
int edgemake(int from,int to)
{
e[++lon].to=to;
e[lon].next=head[from];
head[from]=lon;
return(0);
}
int n;
int text[maxn],son[maxn],num[maxn];
int numn;
int dfs(int t)
{
num[t]=++numn;
son[t]=1;
for(int
k=head[t];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(!text[u])
{
text[u]=1;
dfs(u);
text[u]=0;
son[t]+=son[u];
}
}
return(0);
}
struct
{
int l,r;
int sum;
}tr[maxn<<2];
int maketree(int t,int l,int r)
{
tr[t].l=l;
tr[t].r=r;
tr[t].sum=1;
if(l==r)
return(0);
int mid=midt;
maketree(ls,l,mid);
maketree(rs,mid+1,r);
tr[t].sum=tr[ls].sum+tr[rs].sum;
}
int modify(int t,int txt,int tmp)
{
if(tr[t].l==tmp&&tr[t].r==tmp)
{
tr[t].sum+=txt;
return(0);
}
int mid=midt;
if(tmp<=mid)
modify(ls,txt,tmp);
else
if(mid+1<=tmp)
modify(rs,txt,tmp);
tr[t].sum+=txt;
}
int query(int t,int l,int r)
{
if(tr[t].l>=l&&tr[t].r<=r)
return(tr[t].sum);
int ret=0;
int mid=midt;
if(l<=mid) ret+=query(ls,l,r);
if(r>=mid+1) ret+=query(rs,l,r);
return(ret);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
lon=0;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
int
from,to;
scanf("%d
%d",&from,&to);
edgemake(from,to);
edgemake(to,from);
}
memset(text,0,sizeof(text));
memset(son,0,sizeof(son));
text[1]=1;
numn=0;
dfs(1);
maketree(1,1,n);
int m;
scanf("%d",&m);
memset(a,0,sizeof(a));
char tmp[10];
for(int i=1;i<=m;i++)
{
int
txt;
scanf("%s
%d",tmp,&txt);
if(tmp[0]=='Q')
{
int
ans=query(1,num[txt],num[txt]+son[txt]-1);
printf("%d\n",ans);
}
else
{
a[txt]^=1;
if(a[txt]==1)
modify(1,-1,num[txt]);
else
modify(1,1,num[txt]);
}
}
}
return 0;
}