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],l=1,w=0,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) dfs(i);
  15. }
  16. odw[v].S=l;
  17. l++;
  18. }
  19.  
  20. void Update(int v,int p,int k){
  21. if(b<p||k<a) return;
  22. if(a<=p&&k<=b) tree[v]++;
  23. else{
  24. Update(2*v,p,(p+k)/2); Update(2*v+1,(p+k)/2+1,k);
  25. }
  26. }
  27.  
  28. int Read(int v){
  29. w=0;
  30. while(v>0){
  31. w+=tree[v];
  32. v/=2;
  33. }
  34. return w;
  35. }
  36.  
  37. int main(){
  38. int n,m;
  39. char x;
  40. cin>>n;
  41. for(int i=1;i<n;i++){
  42. cin>>a>>b;
  43. g[a].push_back(b);
  44. g[b].push_back(a);
  45. }
  46. dfs(1);
  47. for(int i=1;i<=n;i++) cout<<odw[i].F<<" "<<odw[i].S<<endl;
  48. //czy dziala?
  49. cin>>m;
  50. for(int i=1;i<n+m;i++){
  51. cin>>x;
  52. if(x=='A'){
  53. cin>>a>>b;
  54. a=odw[b].F+poc;
  55. b=odw[b].S+poc;
  56. Update(1,poc+1,2*poc+1);
  57. }
  58. else{
  59. cin>>a;
  60. cout<<Read(a+poc)<<"\n";
  61. }
  62. }
  63. }
Success #stdin #stdout 0.01s 11912KB
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
1 10
2 3
4 5
6 9
7 8
0
1
2
0