fork download
  1. //Lib
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<ctime>
  7.  
  8. #include<iostream>
  9. #include<algorithm>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. using namespace std;
  16. //Macro
  17. #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
  18. #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
  19. #define erep(i,e,x) for(int i=x;i;i=e[i].next)
  20. #define irep(i,x) for(__typeof(x.begin()) i=x.begin();i!=x.end();i++)
  21. #define read() (strtol(ipos,&ipos,10))
  22. #define sqr(x) ((x)*(x))
  23. #define pb push_back
  24. #define PS system("pause");
  25. typedef long long ll;
  26. typedef pair<int,int> pii;
  27. const int oo=~0U>>1;
  28. const double inf=1e100;
  29. const double eps=1e-6;
  30. string name="", in=".in", out=".out";
  31. //Var
  32. struct BIT
  33. {
  34. int s[500008],limit;
  35. void Set(int l){memset(s,0,sizeof s);limit=l;}
  36. inline int lowbit(int x){return x&-x;}
  37. void Update(int a,int b)
  38. {
  39. for(int i=a;i<=limit;i+=lowbit(i))
  40. s[i]+=b;
  41. }
  42. int Get(int a)
  43. {
  44. int ret=0;
  45. for(int i=a;i>0;i-=lowbit(i))
  46. ret+=s[i];
  47. return ret;
  48. }
  49. }T;
  50. struct E
  51. {
  52. int next,node;
  53. }e[500008];
  54. int tot=1,cnt,n,m,h[250008],evis[500008],vin[250008],vout[250008];
  55. void add(int a,int b){e[++tot].next=h[a];e[tot].node=b;h[a]=tot;}
  56. void Init()
  57. {
  58. int a,b;
  59. scanf("%d",&n);
  60. rep(i,1,n-1)
  61. scanf("%d%d",&a,&b),add(a,b),add(b,a);
  62. T.Set(n<<1);
  63. }
  64. void DFS(int fa,int u)
  65. {
  66. vin[u]=++cnt;
  67. T.Update(vin[u],1);
  68. erep(i,e,h[u])
  69. if(e[i].node!=fa)
  70. DFS(u,e[i].node),evis[i]=true;
  71. vout[u]=++cnt;
  72. T.Update(vout[u],-1);
  73. }
  74. void Work()
  75. {
  76. DFS(0,1);
  77. int a,b,flag;char ch;
  78. scanf("%d%*c",&m);
  79. rep(i,1,n-1+m)
  80. {
  81. scanf("%c",&ch);
  82. if(ch=='A')
  83. {
  84. scanf("%d%d%*c",&a,&b);
  85. erep(i,e,h[a])if(e[i].node==b){flag=i;break;}
  86. if(!evis[flag])swap(a,b);
  87. T.Update(vin[b],-1);
  88. T.Update(vout[b],1);
  89. }
  90. else
  91. {
  92. scanf("%d%*c",&a);
  93. printf("%d\n",T.Get(vin[a])-1);
  94. }
  95. }
  96. }
  97. int main()
  98. {
  99. // freopen((name+vin).c_str(),"r",stdin);
  100. // freopen((name+vout).c_str(),"w",stdout);
  101. Init();
  102. Work();
  103. return 0;
  104. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty