#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 100010
int N;
int cnt=0;
int c[MAXN];
int start[MAXN];
int end[MAXN];
struct Node
{
int num;
Node* next; //孩子节点
Node()
{next = NULL;}
}tree[MAXN]; //临界表
int lowbit(int x)
{
return x & (-x);
}
void add(int d,int x)
{
while(d<=N){
c[d] += x;
d += lowbit(d);
}
}
int sum(int d)
{
int ans =0;
while(d>=1){
ans += c[d];
d -= lowbit(d);
}
return ans;
}
void dfs(int v) //以r为根节点进行dfs遍历,返整个遍历之后的时间
{
start[v] = ++cnt;
Node* p = tree[v].next;
while(p){
if(start[p->num]==0)
dfs(p->num);
p = p->next;
}
end[v] = cnt;
}
void addedge(int a,int b) //在苹果树上加分支
{
Node* p = new Node;
p->num = b;
p->next = tree[a].next;
tree[a].next = p;
}
int main()
{
int i,q;
scanf("%d",&N);
for(i=1;i<N;i++){
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs(1);
for(i=1;i<=N;i++) //初始化c[]
add(i,1);
scanf("%d",&q);
while(q--){ //q次操作
char cmd[10];
int d;
scanf("%s%d",cmd,&d);
if(cmd[0]=='C'){
if(sum(start[d])-sum(start[d]-1)==1)
add(start[d],-1);
else
add(start[d],1);
}
else if(cmd[0]=='Q'){
printf("%d\n",sum(end[d])-sum(start[d]-1));
}
}
return 0;
}
Apple Tree
最新推荐文章于 2022-03-19 17:21:38 发布