POJ3321 Apple Tree
来源:互联网 发布:linux vi进入编辑模式 编辑:程序博客网 时间:2024/06/11 22:55
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100002;//3321Accepted4468K438MSC++1790B2013-08-12 23:20:18struct node1 { int next, tail;}edge[maxn];struct node2 { int r, l;}apple[maxn];int s[maxn], cnt, c[maxn], a[maxn];void dfs(int u) { int i; apple[u].l = cnt; for(i = s[u]; i != -1; i = edge[i].next) { dfs(edge[i].tail); } apple[u].r = ++cnt;}inline int lowbit(int x) { return x&(-x);}void change(int x) { int i; if(a[x]) { for(i = x; i <= cnt; i += lowbit(i)) { c[i]++; } } else { for(i = x; i <= cnt; i += lowbit(i)) { c[i]--; } }}int sum(int x) { int i, res = 0; for(i = x; i > 0; i -= lowbit(i)) res += c[i]; return res;}int main() { int i, n, m, t1, t2, t; char str[3]; scanf("%d", &n); memset(s, -1, sizeof(s[0])*(n+1)); memset(c, 0, sizeof(c[0])*(n+1)); memset(apple, 0, sizeof(apple[0])*(n+1)); for(i = 0; i < n-1; i++) { scanf("%d%d", &t1, &t2); edge[i].tail = t2; edge[i].next = s[t1]; s[t1] = i; } cnt = 1; dfs(1); scanf("%d", &m); //a[1] = 1; change(a[1]); c[1] = 0; for(i = 2; i <= n+1; i++) { a[i] = 1; change(i); } while(m--) { scanf("%s", str); scanf("%d", &t); getchar(); if(str[0]=='Q') { int res = sum(apple[t].r) - sum(apple[t].l); printf("%d\n", res); } else { a[apple[t].r] = (a[apple[t].r] + 1)%2; change(apple[t].r); } } return 0;}/**71 21 42 32 74 54 64Q 1Q 3C 3Q 1**/