树状数组+DFS序
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define MAXN 500500
#define lowbit(x) (x&(-x))
using namespace std;
int n,m;
int c[2*MAXN];
struct node{
int from, to, next;
}edge[MAXN*2];
int q[MAXN*2];
int top,tot;
inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int head[MAXN*2],cnt;
int l[MAXN*2],r[MAXN*2],fa[2*MAXN];
void add(int x,int y)
{
edge[++cnt].from=x;
edge[cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt;
}
void dfs(int x)
{
q[++top]=x;
while(top)
{
int now=q[top],f=fa[top--];
if (!l[now])
{
l[now]=++tot;
q[++top]=now;
for (int i=head[now];i;i=edge[i].next)
{
if (edge[i].to==f) continue;
fa[++top]=now;
q[top]=edge[i].to;
}
}
else r[now]=++tot;
}
return ;
}
int query(int x)
{
int sum=0;
for (int i=x;i;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
}
void update(int x,int delta)
{
for (int i=x;i<=2*n;i+=lowbit(i))
{
c[i]+=delta;
}
return ;
}
int main()
{
n=read();
for (int i=1;i<n;i++)
{
int x,y;
x=read();y=read();
add(x,y);add(y,x);
}
dfs(1);
for (int i=1;i<=n;i++)
{
update(l[i],1);update(r[i],-1);
}
int mark=0;
m=read();
while (mark<m)
{
char ch[5];
scanf("%s",ch);
if (ch[0]=='A')
{
int x,y;
x=read(),y=read();
update(l[y],-1);
update(r[y],1);
}
else
{
int x;
x=read();
mark++;
printf("%d\n",query(l[x])-1);
}
}
return 0;
}