裸的dfs序,直接树状数组维护就好了。
//QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
const int maxm=200000+10;
int first[maxn],next[maxm],ecnt;
struct Edge{int u,v;Edge(int u=0,int v=0):u(u),v(v){}}e[maxm];
inline void add_edge(int u,int v){
next[ecnt]=first[u];first[u]=ecnt;e[ecnt++]=Edge(u,v);
next[ecnt]=first[v];first[v]=ecnt;e[ecnt++]=Edge(v,u);
}
int L[maxn],R[maxn];
int dfs_clk;
void dfs(int u,int fa){
L[u]=++dfs_clk;
for(int i=first[u];i!=-1;i=next[i])
if(e[i].v!=fa) dfs(e[i].v,u);
R[u]=dfs_clk;
}
int C[maxn],n;
#define lowbit(i) ((i)&-(i))
inline void updata(int pos,int val){
for(int i=pos;i<=n;i+=lowbit(i)) C[i]+=val;
}
inline int query(int pos){
int ret=0;
for(int i=pos;i;i-=lowbit(i)) ret+=C[i];
return ret;
}
char op[10];int x;
int vis[maxn];
int main()
{
cin>>n;memset(first,-1,sizeof first);
for(int i=1;i<=n;++i) updata(i,vis[i]=1);
for(int i=1,u,v;i<n;++i){
scanf("%d%d",&u,&v);
add_edge(u,v);
}
dfs(1,1);
int m;cin>>m;
while(m--)
{
scanf("%s%d",op,&x);
if(op[0]=='C')
{
if(vis[x]) updata(L[x],-1);
else updata(L[x],1);
vis[x]^=1;
}
else printf("%d\n",query(R[x])-query(L[x]-1));
}
return 0;
}