AlexNeagu11

LCA

Feb 10th, 2022
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. ifstream in("lca.in");
  4. ofstream out("lca.out");
  5. const int nax = 200005;
  6.  
  7. vector<int> adj[nax];
  8. int logaritm[3 * nax];
  9.  
  10. vector<pair<int,int>> euler;
  11. vector<int> first(nax);
  12. vector<vector<int>> rmq(nax * 3, vector<int> (20, 0));
  13.  
  14. void dfs(int node, int prd, int lvl) {
  15. first[node] = euler.size();
  16. euler.push_back({node, lvl});
  17. for(auto it : adj[node]) {
  18. if(it == prd) {
  19. continue;
  20. }
  21. dfs(it, node, lvl + 1);
  22. euler.push_back({node, lvl});
  23. }
  24. }
  25.  
  26. void computeMins() {
  27. int n = euler.size();
  28. for(int i = 0; i < n; ++i) {
  29. rmq[i][0] = i;
  30. }
  31. for(int i = 1; (1 << i) <= n; ++i) {
  32. for(int j = 0; j + (1 << i) - 1 < n; ++j) {
  33. int k = rmq[j][i - 1];
  34. int l = rmq[j + (1 << (i - 1))][i - 1];
  35. if(euler[k].second < euler[l].second) {
  36. rmq[j][i] = k;
  37. } else {
  38. rmq[j][i] = l;
  39. }
  40. }
  41. }
  42. }
  43. int findLCA(int x, int y) {
  44.  
  45. x = first[x];
  46. y = first[y];
  47.  
  48. if(x > y) {
  49. swap(x, y);
  50. }
  51. int len = logaritm[y - x + 1];
  52. int k = rmq[x][len];
  53. int l = rmq[y - (1 << len) + 1][len];
  54. if(euler[k].second < euler[l].second) {
  55. return euler[k].first;
  56. }
  57. return euler[l].first;
  58. }
  59.  
  60.  
  61. int main() {
  62. ios_base::sync_with_stdio(false);
  63. cin.tie(0);
  64.  
  65. logaritm[1] = 0;
  66. for(int i = 2; i < nax; i++) {
  67. logaritm[i] = logaritm[i / 2] + 1;
  68. }
  69.  
  70. int n, m;
  71. in >> n >> m;
  72.  
  73. for(int i = 2; i <= n; ++i) {
  74. int x;
  75. in >> x;
  76. adj[x].push_back(i);
  77. adj[i].push_back(x);
  78. }
  79.  
  80. dfs(1, 0, 0);
  81. computeMins();
  82.  
  83. for(int i = 1; i <= m; ++i) {
  84. int x, y;
  85. in >> x >> y;
  86. out << findLCA(x, y) << '\n';
  87. }
  88.  
  89. return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment