fork(1) download
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. using namespace std;
  5. int const N=300001,poc=1<<19;
  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. for(int i:g[v]){
  13. if(odw[i].F==0) {
  14. if(gl[i]==0) gl[i]=gl[v]+1;
  15. dfs(i);
  16. }
  17. }
  18. odw[v].S=l;
  19. l++;
  20. }
  21.  
  22. void Update(int v,int p,int k){
  23. if(b<p||k<a) return;
  24. if(a<=p&&k<=b) tree[v]++;
  25. else{
  26. Update(2*v,p,(p+k)/2); Update(2*v+1,(p+k)/2+1,k);
  27. }
  28. }
  29.  
  30. int Read(int v){
  31. w=tree[v];
  32. v/=2;
  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. if(gl[a]>gl[b]) swap(a,b);
  58. a=odw[b].F+poc;
  59. b=odw[b].S+poc;
  60. Update(1,poc+1,2*poc);
  61. }
  62. else{
  63. cin>>a;
  64. cout<<gl[a]-Read(odw[a].F+poc)<<"\n";
  65. }
  66. }
  67. }
Success #stdin #stdout 0.01s 16016KB
stdin
5
1 2
1 3
1 4
4 5
4
A 4 5
W 5
A 1 5
W 5
W 2
A 1 2
W 2
A 1 3
stdout
2
2
1
1