Advertisement
Anuiel

LCA gay shit

Oct 14th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define endl "\n"
  6.  
  7. const int MAXN = 1e5 + 10, MAXM = 1e7 + 10;
  8. int d[4 * MAXN];
  9. vector <pair<int, int> > rmq;
  10. vector <int> g[MAXN];
  11. int founded[MAXN];
  12. long long a[2 * MAXM];
  13. bool used[MAXN];
  14. long long n, m;
  15.  
  16. void full() {
  17. for (int i = 2; i < 4 * MAXN; i++)
  18. d[i] = d[i / 2] + 1;
  19. }
  20.  
  21. void dfs(int u, int h, long long& i) {
  22. used[u] = true;
  23. founded[u] = i;
  24. rmq.push_back({h, u});
  25. for (int v : g[u]) {
  26. if (!used[v]) {
  27. i++;
  28. dfs(v, h + 1, i);
  29. rmq.push_back({h, u});
  30. i++;
  31. }
  32. }
  33. }
  34.  
  35. /*
  36. void print() {
  37. cout << " a " << endl;
  38. for (int i = 0; i < 2 * m; i++) {
  39. cout << a[i] << " ";
  40. }
  41. cout << endl << " rmq " << endl;
  42. for (unsigned i = 0; i < rmq.size(); i++) {
  43. cout << rmq[i].first << " ";
  44. }
  45. cout << endl;
  46. for (unsigned i = 0; i < rmq.size(); i++) {
  47. cout << rmq[i].second << " ";
  48. }
  49. cout << endl << " first meat " << endl;
  50. for (unsigned i = 0; i < n; i++) {
  51. cout << founded[i] << " ";
  52. }
  53. cout << endl << " Now program " << endl;
  54. }
  55. */
  56.  
  57. signed main() {
  58. /*
  59. 14 10
  60. 0 1 0 0 2 3 6 4 4 5 5 8 3
  61. 12 9
  62. 1 1 1
  63. */
  64. full();
  65. cin >> n >> m;
  66. for (int i = 1; i < n; i++) {
  67. int v;
  68. cin >> v;
  69. g[v].push_back(i);
  70. g[i].push_back(v);
  71. }
  72. cin >> a[0] >> a[1];
  73. long long x, y, z;
  74. cin >> x >> y >> z;
  75. for (int i = 2; i < 2 * m; i++) {
  76. a[i] = (x * a[i - 2] + y * a[i - 1] + z) % n;
  77. }
  78. long long o = 0;
  79. dfs(0, 0, o);
  80. // print();
  81. pair<int, int> Sparse[rmq.size()][30];
  82. for (int i = 0; i < rmq.size(); i++) {
  83. Sparse[i][0] = rmq[i];
  84. }
  85. for (int k = 1; k < 20; k++) {
  86. for (int i = 0; i < (int) rmq.size() - (1 << (k - 1)); i++) {
  87. Sparse[i][k] = min(Sparse[i][k - 1], Sparse[i + (1 << (k - 1))][k - 1]);
  88. }
  89. }
  90. long long last_ans = 0, a1 = a[0], a2 = a[1];
  91. long long sum = 0;
  92. for (int i = 0; i < m; i++) {
  93. a1 = a[2 * i], a2 = a[2 * i + 1];
  94. a1 = (a1 + last_ans) % n;
  95. // cout << a1 << " " << a2;
  96. int L = founded[a1], R = founded[a2];
  97. if (L > R) {
  98. swap(L, R);
  99. }
  100. // cout << " [] " << L << " " << R << " " << d[R - L];
  101. pair <int, int> ans;
  102. if (R == L) {
  103. ans = Sparse[L][0];
  104. } else {
  105. int p = d[R - L];
  106. ans = min(Sparse[L][p], Sparse[R - (1 << (p))][p]);
  107. }
  108. // cout << " LCA " << ans.second << endl;
  109. sum += ans.second;
  110. last_ans = ans.second;
  111. }
  112. cout << sum;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement