Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=1024;
  4. vector<int>v[MAXN];
  5. vector<int>level,euler;
  6. vector<pair<int,int> >query;
  7. int n,logg[MAXN*2],s[MAXN][MAXN],idx[MAXN];
  8. bool used[MAXN];
  9. ///----------------------------------------------
  10. void read()
  11. {
  12. string s;
  13. int x,y;
  14. cin>>n;
  15. for(int i=0;i<n;i++)
  16. {
  17. cin>>s;
  18. cin>>x>>y;
  19. if(s=="ADD")
  20. {
  21. v[x].push_back(y);
  22. v[y].push_back(x);
  23. }
  24. else
  25. {
  26. query.push_back(make_pair(x,y));
  27. }
  28. }
  29. }
  30. ///----------------------------------------------
  31. void dfs(int i,int lvl)
  32. {
  33. used[i]=true;
  34. level.push_back(lvl);
  35. euler.push_back(i);
  36. for(int j=0;j<v[i].size();j++)
  37. {
  38. int nb=v[i][j];
  39. if(!used[nb])
  40. {
  41. dfs(nb,lvl+1);
  42. level.push_back(lvl);
  43. euler.push_back(i);
  44. }
  45. }
  46. }
  47. ///----------------------------------------------
  48. void init_sparse()
  49. {
  50. for(int i=0;i<level.size();i++)s[i][0]=i;
  51. }
  52. ///----------------------------------------------
  53. void init_edges()
  54. {
  55. memset(used,0,sizeof(used));
  56. for(int i=0;i<euler.size();i++)
  57. {
  58. if(!used[euler[i]])
  59. {
  60. idx[euler[i]]=i;
  61. used[euler[i]]=true;
  62. }
  63. }
  64. }
  65. ///----------------------------------------------
  66. void init_logg()
  67. {
  68. logg[1]=0;
  69. for(int i=2;i<=MAXN;i++)
  70. {
  71. logg[i]=logg[i-1];
  72. if((i&(i-1))==0)logg[i]++;
  73. }
  74. }
  75. ///----------------------------------------------
  76. void make_sparse()
  77. {
  78. for(int j=1;(1<<j)<n;j++)
  79. {
  80. for(int i=0;i+(1<<j)-1<n;i++)
  81. {
  82. int z1=s[i][j-1],z2=s[i+(1<<(j-1))][j-1];
  83. if(level[z1]<level[z2])
  84. s[i][j]=z1;
  85. else
  86. s[i][j]=z2;
  87. }
  88. }
  89. }
  90. ///----------------------------------------------
  91. void lca(int l,int r)
  92. {
  93. l=idx[l];
  94. r=idx[r];
  95. if(r<l)swap(l,r);
  96. cout<<l<<" "<<r<<endl;
  97. int x,y;
  98. x=r-l+1;
  99. y=logg[r];
  100. int z1,z2;
  101. z1=s[l][y];
  102. z2=s[r-(1<<y)][y];
  103. cout<<l<<" "<<y<<" "<<r-(1<<y)<<" "<<z1<<" "<<z2<<endl;
  104. if(level[z1]<level[z2])
  105. cout<<euler[z1]<<endl;
  106. else
  107. cout<<euler[z2]<<endl;
  108. }
  109. ///----------------------------------------------
  110. void solve()
  111. {
  112. dfs(1,1);
  113. init_sparse();
  114. make_sparse();
  115. init_edges();
  116. init_logg();
  117. for(int i=0;i<level.size();i++)cout<<level[i]<<" ";
  118. cout<<endl;
  119. for(int i=0;i<euler.size();i++)cout<<euler[i]<<" ";
  120. cout<<endl;
  121. for(int i=1;i<=n;i++)cout<<idx[i]<<" ";
  122. cout<<endl;
  123.  
  124. for(int i=0;i<query.size();i++)
  125. {
  126. cout<<query[i].first<<" "<<query[i].second<<endl;
  127. lca(query[i].first, query[i].second);
  128. }
  129. }
  130. ///----------------------------------------------
  131. int main ()
  132. {
  133. read();
  134. solve();
  135. return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement