#include<cstdio>
#include<cstring>
#define MAX_N 100010
using namespace std;
struct apple
{
int to,next;
}A[MAX_N<<1];
int head[MAX_N],cnt,in[MAX_N],out[MAX_N],bit[MAX_N],k,n,apple[MAX_N];
void add_edge(int from,int to)
{
A[cnt].to=to;
A[cnt].next=head[from];
head[from]=cnt++;
}
void dfs(int v,int u)
{
in[v]=++k;
for(int i=head[v];i!=-1;i=A[i].next)
{
if(A[i].to!=u)
{
dfs(A[i].to,v);
}
}
out[v]=k;
return ;
}
void add(int i,int v)
{
while(i<=n)
{
bit[i]+=v;
i+=i&-i;
}
}
int sum(int i)
{
int res=0;
while(i>0)
{
res+=bit[i];
i-=i&-i;
}
return res;
}
int main()
{
int Q;
char str[100];
cnt=0;
k=0;
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
for(int i=1;i<=n;i++)
{
add(i,1);
apple[i]=1;
}
dfs(1,-1);
scanf("%d",&Q);
while(Q--)
{
int v;
scanf("%s%d",str,&v);
if(str[0]=='Q')
{
// printf("%d %d %d %d\n",in[v],out[v],sum(in[v]-1),sum(out[v]));
printf("%d\n",sum(out[v])-sum(in[v]-1));
}
else
{
if(apple[v])
{
add(in[v],-1);
apple[v]=0;
}
else
{
add(in[v],1);
apple[v]=1;
}
}
}
}
poj 3321 计算一个树的子树共有多少节点
最新推荐文章于 2021-11-27 00:56:51 发布