Advertisement
Guest User

Untitled

a guest
Jul 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int n, q;
  9. int x[3];
  10. int a[400000];
  11. int d[400000];
  12. int p[400000];
  13. pair<int, int> tree[400000];
  14. vector<int> g[400000];
  15. vector<int> v;
  16.  
  17. pair<int, int> mp(pair<int, int> lhs, pair<int, int> rhs)
  18. {
  19. if (lhs.first < rhs.first)
  20. return lhs;
  21. return rhs;
  22. }
  23.  
  24. void dfs(int curr, int prev, int dpt)
  25. {
  26. v.push_back(dpt);
  27. a[curr] = v.size() - 1;
  28. d[curr] = dpt;
  29. p[v.size() - 1] = curr;
  30.  
  31. for (int i = 0; i < g[curr].size(); i++)
  32. {
  33. if (g[curr][i] == prev) continue;
  34.  
  35. dfs(g[curr][i], curr, dpt + 1);
  36. v.push_back(dpt);
  37. a[curr] = v.size() - 1;
  38. d[curr] = dpt;
  39. p[v.size() - 1] = curr;
  40. }
  41. }
  42.  
  43. void build(int node, int s, int e)
  44. {
  45. if (s > e)
  46. return;
  47.  
  48. if (s == e)
  49. {
  50. tree[node] = make_pair(v[s], s);
  51. return;
  52. }
  53.  
  54. int mid = (s + e) / 2;
  55.  
  56. build(2 * node, s, mid);
  57. build(2 * node + 1, mid + 1, e);
  58.  
  59. tree[node] = mp(tree[2 * node], tree[2 * node + 1]);
  60. }
  61.  
  62. pair<int, int> query(int node, int s, int e, int l, int r)
  63. {
  64. if (s > r || l > e || s > e)
  65. return make_pair(1 << 30, l);
  66.  
  67. // cout << s << " " << e << " " << l << " " << r << endl;
  68.  
  69. if (s >= l && e <= r)
  70. return tree[node];
  71.  
  72. int mid = (s + e) / 2;
  73.  
  74. pair<int, int> s1 = query(2 * node, s, mid, l, r);
  75. pair<int, int> s2 = query(2 * node + 1, mid + 1, e, l, r);
  76.  
  77. // cout << s << " " << e << " " << l << " " << r << ": " << s1.first << " " << s1.second << "; " << s2.first << " " << s2.second << endl;
  78.  
  79. return mp(s1, s2);
  80. }
  81.  
  82. int dst(int ca, int cb)
  83. {
  84. int can = p[query(1, 0, n - 1, min(a[ca], a[cb]), max(a[ca], a[cb])).second];
  85.  
  86. cout << min(a[ca], a[cb]) << " " << max(a[ca], a[cb]) << endl;
  87.  
  88. cout << ca + 1 << " -> " << cb + 1 << " " << can + 1 << ": " << d[ca] << " - " << d[can] << " + " << d[cb] << " = " << d[ca] - d[can] + d[cb] << endl;
  89.  
  90. return d[ca] - d[can] + d[cb];
  91. }
  92.  
  93. int main()
  94. {
  95. ifstream cin("in.txt");
  96.  
  97. cin >> n >> q;
  98.  
  99. int curr;
  100. for (int i = 1; i < n; i++)
  101. {
  102. cin >> curr;
  103.  
  104. g[i].push_back(curr - 1);
  105. g[curr - 1].push_back(i);
  106. }
  107.  
  108. dfs(0, -1, 0);
  109. build(1, 0, v.size() - 1);
  110.  
  111. for (int i = 0; i < v.size(); i++)
  112. cout << p[i] + 1 << " ";
  113. cout << endl;
  114. for (int i = 0; i < v.size(); i++)
  115. cout << v[i] << " ";
  116. cout << "\n\n";
  117.  
  118. int ac, bc, ab, cres, res;
  119. for (int i = 0; i < q; i++)
  120. {
  121. for (int j = 0; j < 3; j++)
  122. {
  123. cin >> x[j];
  124. x[j]--;
  125. }
  126.  
  127. // sort(x, x + 3);
  128.  
  129. res = 0;
  130. // do
  131. // {
  132. ac = p[query(1, 0, v.size() - 1, min(a[x[0]], a[x[2]]), max(a[x[0]], a[x[2]])).second];
  133. bc = p[query(1, 0, v.size() - 1, min(a[x[1]], a[x[2]]), max(a[x[1]], a[x[2]])).second];
  134. ab = p[query(1, 0, v.size() - 1, min(a[x[0]], a[x[1]]), max(a[x[0]], a[x[1]])).second];
  135.  
  136. cout << ac + 1 << " " << bc + 1 << " " << ab + 1 << endl;
  137.  
  138. cres = 0;
  139. if (ac == bc)
  140. cres += dst(ab, ac);
  141.  
  142. cres += dst((d[ac] > d[bc] ? ac : bc), x[2]);
  143. res = max(cres, res);
  144. // }
  145. // while (next_permutation(x, x + 3));
  146.  
  147. cout << res + 1 << endl;
  148. }
  149.  
  150. return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement