3
2
/*
Author: 2486
Memory: 10004 KB Time: 766 MS
Language: G++ Result: Accepted
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r
#define root 1, 1, N
const int MAXN = 2e5 + 5;
int sum[MAXN << 2], LU[MAXN], RU[MAXN], N, M, A, B, tot, K;
char op[10];
/***********加边模板***************/
int Head[MAXN], Next[MAXN], rear;
struct edge {
int u,v;
} es[MAXN];
void Edge_Init() {
rear = 0;
memset(Head, -1, sizeof(Head));
}
void Edge_Add(int u,int v) {
es[rear].u = u;
es[rear].v = v;
Next[rear] = Head[u];
Head[u] = rear ++;
}
void DFS(int to, int from) {
LU[to] = ++ tot;//用来标记属于它的子树的序列
for(int i = Head[to] ; ~ i; i = Next[i]) {
int v = es[i].v;
if(v == from) continue;
DFS(v, to);
}
RU[to] = tot;
}
/**********************************/
void pushup(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1|1];
}
void build(int rt, int l, int r) {
if(l == r) {
sum[rt] = 1;
return ;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
}
void update(int p,int rt,int l, int r) {
if(l == r) {
sum[rt] ^= 1;
return;
}
int mid = (l + r) >> 1;
if(p <= mid) update(p, lson);
else update(p, rson);
pushup(rt);
}
int query(int L, int R,int rt, int l, int r) {
if(L <= l && r <= R) {
return sum[rt];
}
int mid = (l + r) >> 1;
int res = 0;
if(L <= mid) res += query(L, R, lson);
if(R > mid) res += query(L, R, rson);
return res;
}
int main() {
//freopen("D://imput.txt","r",stdin);
while(~ scanf("%d", &N)) {
tot = 0;
build(root);
Edge_Init();
for(int i = 1; i < N ; i ++) {
scanf("%d%d", &A, &B);
Edge_Add(A, B);
Edge_Add(B, A);
}
DFS(1, -1);
scanf("%d", &M);
while(M --) {
scanf("%s %d", op, &K);
if(op[0] == 'C') {
update(LU[K],root);
} else {
printf("%d
", query(LU[K],RU[K],root));
}
}
}
return 0;
}