Advertisement
hoanmalai

HCM Financial Center

May 31st, 2022
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 5;
  5. int n, q;
  6. vector<int>g[N];
  7. int dep[N];
  8. int parent[N][20];
  9.  
  10. void dfs(int u, int p){
  11. parent[u][0] = p;
  12. for (int v : g[u]){
  13. if (v == p) continue;
  14. dep[v] = dep[u] + 1;
  15. dfs(v, u);
  16. }
  17. }
  18.  
  19. int lca(int u, int v){
  20. if (dep[u] > dep[v]) swap(u, v);
  21. for (int k = 18; k >= 0; k--) {
  22.  
  23. if (dep[parent[v][k]] >= dep[u]) {
  24. v = parent[v][k];
  25. }
  26. }
  27. for (int k = 18; k >= 0; k--){
  28. if (parent[u][k] != parent[v][k]){
  29. u = parent[u][k];
  30. v = parent[v][k];
  31. }
  32. }
  33. while (u != v) {
  34. u = parent[u][0];
  35. v = parent[v][0];
  36. }
  37. return u;
  38. }
  39.  
  40. void preprocess(){
  41. dep[0] = 0;
  42. dfs(0, 0);
  43. for (int k = 1; k <= 18; k++){
  44. for (int i = 0; i < n; i++){
  45. parent[i][k] = parent[parent[i][k-1]][k-1];
  46. }
  47. }
  48. }
  49.  
  50. int ans;
  51. void process(int a, int b, int c){
  52. int ac = lca(a, c);
  53. int ab = lca(a, b);
  54. int bc = lca(b, c);
  55. if (ab == bc){
  56. if (ac == b){
  57. ans = max(ans, 1);
  58. }
  59. else {
  60. if (ac != ab){
  61. int tmp = abs(dep[ab] - dep[b]) + abs(dep[ab] - dep[ac]) + 1;
  62. ans = max(ans, tmp);
  63. }
  64. else {
  65. ans = max(ans, abs(dep[ac] - dep[b]) + 1);
  66. }
  67. }
  68. }
  69. else {
  70. ans = max(ans, 1 + abs(dep[b] - max(dep[ab], dep[bc])));
  71. }
  72. }
  73.  
  74. int main(){
  75. cin >> n >> q;
  76. for (int i = 1; i < n; i++){
  77. int x;
  78. cin >> x;
  79. x--;
  80. g[i].push_back(x);
  81. g[x].push_back(i);
  82. }
  83. preprocess();
  84. while(q--){
  85. int a, b, c;
  86. cin >> a >> b >> c;
  87. a--, b--, c--;
  88.  
  89. ans = 0;
  90. process(a, b, c);
  91. process(b, a, c);
  92. process(a, c, b);
  93. cout << ans << endl;
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement