讲解过程在树状数组里的另一篇博客里
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int edges;
int x,n;
int start[100001],endd[100001],c[100001],f[100001];
bool vis[100001],apple[100001];
struct TNode
{
int to,next;
}nod[2*100001];
void addedge(int u,int v)
{
nod[edges].to=v;
nod[edges].next=f[u];
f[u]=edges++;
}
void dfs(int u)
{
edges++;
start[u]=edges;
vis[u]=1;
for(int i=f[u];i!=-1;i=nod[i].next)
{
if(!vis[nod[i].to])
dfs(nod[i].to);
}
endd[u]=edges;
}
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);
}
}
int main()
{
int u,m,qq,v;
char s[5];
memset(f,-1,sizeof(f));
memset(vis,0,sizeof(vis));
memset(apple,1,sizeof(apple));
cin>>n;
for(int i=1;i<n;i++)
{
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
edges=0;
dfs(1);
for(int i=1;i<=n;i++)
{
add(i,1);
}
cin>>m;
while(m--)
{
cin>>s>>qq;
if(s[0]=='C')
{
if(apple[qq])
{
add(start[qq],-1);
apple[qq]=0;
}
else
{
add(start[qq],1);
apple[qq]=1;
}
}
else
{
printf("%d\n",sum(endd[qq])-sum(start[qq]-1));
}
}
}