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=0,w,a,b,c;
  7. pair<int,int>odw[N];
  8. vector<int>g[N];
  9.  
  10. void dfs(int v){
  11. l++;
  12. odw[v].F=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. }
  20. if(g[v].size()!=1)l++;
  21. odw[v].S=l;
  22. }
  23.  
  24. void Update(int v,int p,int k){
  25. if(b<p||k<a) return;
  26. if(a<=p&&k<=b) tree[v]++;
  27. else{
  28. Update(2*v,p,(p+k)/2); Update(2*v+1,(p+k)/2+1,k);
  29. }
  30. }
  31.  
  32. int Read(int v){
  33. w=tree[v];
  34. v/=2;
  35. while(v>0){
  36. w+=tree[v];
  37. v/=2;
  38. }
  39. return w;
  40. }
  41.  
  42. int main(){
  43. ios_base::sync_with_stdio(0);
  44. cin.tie(0);
  45. int n,m;
  46. char x;
  47. cin>>n;
  48. for(int i=1;i<n;i++){
  49. cin>>a>>b;
  50. g[a].push_back(b);
  51. g[b].push_back(a);
  52. }
  53. dfs(1);
  54. //for(int i=1;i<=n;i++) cout<<gl[i]<<' ';
  55. cin>>m;
  56. for(int i=1;i<n+m;i++){
  57. cin>>x;
  58. if(x=='A'){
  59. cin>>a>>b;
  60. //cout<<a<<' '<<b<<' ';
  61. //if(gl[a]>gl[b]) swap(a,b);
  62. a=odw[b].F+poc;
  63. b=odw[b].S+poc;
  64. //cout<<a-poc<<' '<<b-poc<<endl;
  65. if(a!=b) Update(1,poc,2*poc);
  66. else tree[a]++;
  67. }
  68. else{
  69. cin>>a;
  70. if(odw[a].F!=odw[a].S) cout<<gl[a]-Read(odw[a].S+poc-1)<<"\n";
  71. else cout<<gl[a]-Read(odw[a].S+poc)<<"\n";
  72. }
  73. }
  74. }
Success #stdin #stdout 0.01s 13812KB
stdin
6
1 2
2 3
2 4
1 5
5 6
5
W 3
A 1 2
W 3
A 2 4
W 4
W 6
A 5 6
A 1 5
A 2 3
stdout
2
1
0
2