1 /*dfs+线段树(单点修改+区间查询)*/
2 #include "iostream"
3 #include "vector"
4 #include "map"
5 #include "cstdio"
6 #include "cstring"
7
8 using namespace std;
9 typedef long long ll;
10 const int maxn = 100005;
11 int n,m,_time,cnt;
12 int num[maxn],in[maxn],out[maxn],last[maxn];
13 int sum[maxn<<2];
14 struct data{
15 int to,_next;
16 }e[maxn<<1];
17
18 void add(int u,int v){
19 e[++cnt].to = v; e[cnt]._next=last[u]; last[u]=cnt;
20 e[++cnt].to = u; e[cnt]._next=last[v]; last[v]=cnt;
21 }
22
23 void dfs_arr(int x,int fa){
24 in[x]=++_time;
25 num[_time]=x;
26 for(int i=last[x];i;i=e[i]._next){
27 if( e[i].to!=fa ) dfs_arr(e[i].to,x);
28 }
29 out[x]=_time;
30 }
31
32 void build(int pt,int l,int r){
33 int mid=(l+r)>>1;
34 if( l==r ){
35 sum[pt]=1;
36 return ;
37 }
38 build(pt<<1,l,mid);
39 build(pt<<1|1,mid+1,r);
40 sum[pt] = sum[pt<<1]+sum[pt<<1|1];
41 }
42
43 int query(int pt,int L,int R, int l,int r){
44 if( L<=l&&R>=r ) return sum[pt];
45 int mid=(l+r)>>1;
46
47 int sum=0;
48 if( L<=mid ) sum+=query(pt<<1,L,R,l,mid);
49 if( R>mid ) sum+=query(pt<<1|1,L,R,mid+1,r);
50 return sum;
51 }
52
53 void modify(int pt,int x,int l,int r)
54 {
55 int mid=(l+r)>>1;
56 if( l==r )
57 {
58 sum[pt]^=1;
59 return ;
60 }
61 if( x<=mid ) modify(pt<<1,x,l,mid);
62 else modify(pt<<1|1,x,mid+1,r);
63 sum[pt] = sum[pt<<1]+sum[pt<<1|1];
64 return ;
65 }
66
67
68 int main()
69 {
70 scanf("%d",&n);
71 for(int i=1;i<n;i++ ){
72 int u,v;
73 scanf("%d%d",&u,&v);
74 add(u,v);
75 }
76 dfs_arr(1,0);
77 scanf("%d",&m);
78 char ch[10];
79 build(1,1,n);
80 for(int i=1;i<=m;i++){
81 scanf("%s",ch+1);
82 int x;
83 scanf("%d",&x);
84 if( ch[1]=='Q' ) printf("%d\n",query(1,in[x],out[x],1,n));
85 else modify(1,in[x],1,n);
86 }
87 return 0;
88 }