Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. using namespace std;
  5.  
  6. const int INF = 1e9, MAXG = 600010, MAXN = 450010;
  7.  
  8. int n, l, m, b, g, lx, ly, lk, mx, my, mk, a[MAXN], MX;
  9. long long ans, x[MAXG], y[MAXG], k[MAXG], I[MAXG], J[MAXG];
  10.  
  11. struct tree
  12. {
  13. int val;
  14. tree *l, *r;
  15. tree()
  16. {
  17. l = NULL;
  18. r = NULL;
  19. val = 0;
  20. }
  21. };
  22.  
  23. tree *tr[MAXN];
  24.  
  25. tree *update(tree *v, int left, int right, int pos)
  26. {
  27. if (pos >= left && pos < right)
  28. {
  29. if (right - left == 1)
  30. {
  31. tree *t = new tree();
  32. t->val = v->val + 1;
  33. return t;
  34. }
  35. if (!v->l)
  36. {
  37. v->l = new tree();
  38. v->r = new tree();
  39. }
  40. tree *t = new tree();
  41. int m = (left + right) / 2;
  42. t->l = update(v->l, left, m, pos);
  43. t->r = update(v->r, m, right, pos);
  44. t->val = t->l->val + t->r->val;
  45. return t;
  46. }
  47. return v;
  48. }
  49. void get_kstat(tree *v1, tree *v2, int left, int right, int k)
  50. {
  51. if (right - left == 1)
  52. {
  53. ans += left;
  54. return;
  55. }
  56. int cntl = v2->l->val - v1->l->val;
  57. int m = (left + right) / 2;
  58. if (cntl >= k)
  59. get_kstat(v1->l, v2->l, left, m, k);
  60. else
  61. get_kstat(v1->r, v2->r, m, right, k - cntl);
  62. }
  63.  
  64. int main()
  65. {
  66. freopen("gyakkyou.in", "r", stdin);
  67. freopen("gyakkyou.out", "w", stdout);
  68.  
  69. tr[0] = new tree();
  70. cin >> n >> a[0] >> l >> m;
  71. MX = a[0];
  72. for (int i = 1; i < n; i++)
  73. {
  74. a[i] = (1LL * a[i - 1] * l + m) % INF;
  75. MX = max(a[i], MX);
  76. }
  77. for (int i = 0; i < n; i++)
  78. {
  79. tr[i + 1] = update(tr[i], 0, MX + 1, a[i]);
  80. }
  81. cin >> b;
  82. for (int i = 0; i < b; i++)
  83. {
  84. cin >> g >> x[0] >> lx >> mx >> y[0] >> ly >> my >> k[0] >> lk >> mk;
  85. I[0] = min(x[0], y[0]);
  86. J[0] = max(x[0], y[0]);
  87. get_kstat(tr[I[0] - 1], tr[J[0]], 0, MX + 1, k[0]);
  88. for (int j = 1; j < g; j++)
  89. {
  90. x[j] = (((1LL * I[j - 1] - 1) * lx + mx) % n) + 1;
  91. y[j] = (((1LL * J[j - 1] - 1) * ly + my) % n) + 1;
  92. I[j] = min(x[j], y[j]);
  93. J[j] = max(x[j], y[j]);
  94. k[j] = (((k[j - 1] - 1) * lk * 1LL + mk) % (J[j] - I[j] + 1)) + 1;
  95. get_kstat(tr[I[j] - 1], tr[J[j]], 0, MX + 1, k[j]);
  96. }
  97. }
  98. cout << ans << endl;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement