//树状数组做
/*一棵树上长了苹果,每一个树枝节点上有长苹果和不长苹果两种状态,两种操作,一种操作能够改变树枝上苹果的状态,另一种操作询问某一树枝节点一下的所有的苹果有多少。具体做法是做一次dfs,记下每个节点的开始时间Start[i]和结束时间End[i],那么对于i节点的所有子孙的开始时间和结束时间都应位于Start[i]和End[i]之间,另外用一个数组C[i]记录附加在节点i上的苹果的个数,然后用树状数组统计Start[i]到End[i]之间的附加苹果总数。这里用树状数组统计区间可以用Sum(Start[i]-1)-Sum(End[i])来计算。
*/
#include<stdio.h>
#include<string.h>
#include<vector>
#define M 200010
using namespace std;
int c[M*4];
int n,m;
int time;
int lowbit[M];
int start[M],end[M];
bool v[M];
typedef vector<int> INF;
vector<INF> G(M);
/*不知道为什么写成vector<int>G[M] 就TLE了*/
void dfs(int x)
{
start[x]=time++;
for(int i=0;i<G[x].size();i++)
dfs(G[x][i]);
end[x]=time++;
}
void update(int x,int d)
{
while(x<time)
{
c[x]+=d;
x+=lowbit[x];
}
}
int getsum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit[x];
}
return sum;
}
int main()
{
int i;
int a,b;
char ss[10];
scanf("%d",&n);
for(i=0;i<n-1;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
}
time=1;
dfs(1);
c[0]=0;
for(i=1;i<=n;i++)
v[i]=true;
for(i=1;i<time;i++)
lowbit[i]=i&(-i);
for(i=1;i<time;i++)
c[i]=lowbit[i];
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s%d",ss,&a);
if(ss[0]=='C')
{
if(v[a])
{
update(start[a],-1);
update(end[a],-1);
v[a]=false;
}
else
{
update(start[a],1);
update(end[a],1);
v[a]=true;
}
//for(i=1;i<time;i++)
// printf("c[%d]=%d\n",i,c[i]);
}
else if(ss[0]=='Q')
{
int s1=getsum(start[a]-1);
int s2=getsum(end[a]);
printf("%d\n",(s2-s1)/2);
}
}
return 0;
}