///到底怎么建图了啊!!!!!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 100005
using namespace std;
int c[MAXN],head[MAXN],low[MAXN],high[MAXN];
bool visit[MAXN];
int n,m,k,step=0;
struct Edg  ///邻接表建树
{
    int adv;
    int next;
} edg[2*MAXN];
int lowbit(int x)
{
    return x&-x;
}
int sum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=c[x];
        x-=lowbit(x);
    }
    return ret;
}
void add(int x,int d)
{
    while(x<=n)
    {
        c[x]+=d;
        x+=lowbit(x);
    }
}
void addege(int u,int v)   ///建图  树状变成线状的吧???u v是边的两个端点
{
    edg[k].adv=v;
    edg[k].next=head[u];
    head[u]=k; ///1 2 3 4 ~~~~
    k++;
}
void dfs(int u)   ///深搜 重新标号
{
    int i;
    low[u]=step;
    step++;
    visit[u]=true;
    for(i=head[u]; i!=-1; i=edg[i].next)
        if(!visit[edg[i].adv])
            dfs(edg[i].adv);
    high[u]=step;
}
/*
3
1 2
1 3
3
Q 1
C 2
Q 1
这个可以用DFS来实现,每个节点记录第一次访问和最后一次访问时的编号,假设为l和r,
那么区间[l,r]之间的所有编号是以此节点为根节点的子树的各个节点的编号,
这样就把树转化为线性结构了,之后就是用树状数组来处理了
*/
int main(void)
{
    int i,u,v;
    bool f[MAXN];
    char ch;
    memset(head,-1,sizeof(head));
    memset(visit,false,sizeof(visit));
    memset(f,false,sizeof(f));
    scanf("%d",&n);
    k=1;
    for(i=1; i<n; i++)
    {
        scanf("%d%d",&u,&v);
        addege(u,v);
        add(i,1);   ///初始化均有一个苹果
    }
    add(i,1);
    dfs(1);
    scanf("%d",&m);
    while(m--)
    {
        getchar();
        scanf("%c%d",&ch,&i);
        if(ch==‘C‘)   ///更改的
        {
            if(!f[i])   ///有??没有??交替的   所以用bool f[]来控制
            {
                add(low[i],-1);
                f[i]=true;
            }
            else
            {
                add(low[i],1);
                f[i]=false;
            }
        }
        else
            printf("%d\n",sum(high[i])-sum(low[i]-1));
    }
    return 0;
}
/*#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 100005
int edge[MAX<<1];//表示第i条边的终点
int next[MAX<<1];//与第i条边同起点的下一条边的位置
int head[MAX<<1];//以i为起点的第一条边的储存位置
int low[MAX],high[MAX],c[MAX];
bool visit[MAX];
int cnt,n;
int lowbit(int x)
{
    return x&-x;
}
void update(int pos,int value) //更新pos的值
{
    int x=pos;
    while(x<=n)
    {
        c[x]+=value;
        x+=lowbit(x);
    }
}
int get_sum(int pos)//求1到pos位置的和
{
    int x=pos,sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
void insert(int i,int a,int b)//a起点,b终点
{
    edge[i]=b;
    next[i]=head[a];
    head[a]=i;
}
void dfs(int x,int pre)
{
    low[x]=(++cnt);
    for(int i=head[x]; i!=-1; i=next[i])
        if(edge[i]!=pre)
            dfs(edge[i],x);
    high[x]=cnt;
}
int main()
{
    int m;
    int a,b;
    char op[5];
    for(; ~scanf("%d",&n);)
    {
        cnt=0;
        memset(head,-1,sizeof(head));
        memset(next,-1,sizeof(next));
        memset(c,0,sizeof(c));
        for(int i=1,j=1; i<n; ++i)
        {
            scanf("%d%d",&a,&b);
            insert(j++,a,b);
            insert(j++,b,a);
        }
        dfs(1,-1);//遍历树
        //初始化
        for(int i=1; i<=n; ++i)
            update(i,1);
        memset(visit,false,sizeof(visit));
        scanf("%d",&m);
        for(int i=0; i<m; ++i)
        {
            scanf("%s%d",op,&a);
            if(op[0]==‘C‘)//更新
            {
                if(visit[a])
                {
                    update(low[a],1);
                    visit[a]=false;
                }
                else
                {
                    update(low[a],-1);
                    visit[a]=true;
                }
            }
            else//查询
                printf("%d\n",gets_um(high[a])-get_sum(low[a]-1));
        }
    }
    return 0;
}*/