fork(2) download
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. using namespace std;
  5. int const N=250001,poc=1<<18;
  6. int tree[2*poc+1],gl[N],l=1,w,a,b,c;
  7. pair<int,int>odw[N];
  8. vector<int>g[N];
  9.  
  10. void dfs(int v){
  11. odw[v].F=l;
  12. l++;
  13. for(int i:g[v]){
  14. if(odw[i].F==0) {
  15. if(gl[i]==0) gl[i]=gl[v]+1;
  16. dfs(i);
  17. }
  18. }
  19. odw[v].S=l;
  20. l++;
  21. }
  22.  
  23. void Update(int v,int p,int k){
  24. if(b<p||k<a) return;
  25. if(a<=p&&k<=b) tree[v]++;
  26. else{
  27. Update(2*v,p,(p+k)/2); Update(2*v+1,(p+k)/2+1,k);
  28. }
  29. }
  30.  
  31. int Read(int v){
  32. w=0;
  33. while(v>0){
  34. w+=tree[v];
  35. v/=2;
  36. }
  37. return w;
  38. }
  39.  
  40. int main(){
  41. ios_base::sync_with_stdio(0);
  42. cin.tie(0);
  43. int n,m;
  44. char x;
  45. cin>>n;
  46. for(int i=1;i<n;i++){
  47. cin>>a>>b;
  48. g[a].push_back(b);
  49. g[b].push_back(a);
  50. }
  51. dfs(1);
  52. cin>>m;
  53. for(int i=1;i<n+m;i++){
  54. cin>>x;
  55. if(x=='A'){
  56. cin>>a>>b;
  57. a=odw[b].F+poc;
  58. b=odw[b].S+poc;
  59. Update(1,poc+1,2*poc+1);
  60. }
  61. else{
  62. cin>>a;
  63. cout<<gl[a]-Read(odw[a].F+poc-1)<<"\n";
  64. }
  65. }
  66. }
Success #stdin #stdout 0.01s 13132KB
stdin
5
1 2
1 3
1 4
4 5
4
W 5
A 1 4
W 5
A 4 5
W 5
W 2
A 1 2
A 1 3
stdout
2
1
0
1