Advertisement
tien_noob

Polynomial range update - Query max (CHT + sqrt decomposition)

Aug 1st, 2022
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. //Make CSP great again
  2. //Vengeance
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. #define Log2(x) 31 - __builtin_clz(x)
  6. using namespace std;
  7. const int N = 1e5, block = 330;
  8. struct CHT
  9. {
  10. vector<long double> inter;
  11. vector<long long> A, B;
  12. void Clear()
  13. {
  14. inter.clear();
  15. A.clear();
  16. B.clear();
  17. }
  18. long double intersect(long long x1, long long y1, long long x2, long long y2)
  19. {
  20. return (long double)(y2 - y1)/(x1 - x2);
  21. }
  22. void add(long long a, long long b)
  23. {
  24. while(inter.size() > 1 && intersect(a, b, A.back(), B.back()) <= intersect(a, b, A[A.size() - 2], B[B.size() - 2]))
  25. {
  26. inter.pop_back();
  27. A.pop_back();
  28. B.pop_back();
  29. }
  30. if (inter.empty())
  31. {
  32. inter.push_back(-1e18);
  33. }
  34. else
  35. {
  36. inter.push_back(intersect(a, b, A.back(), B.back()));
  37. }
  38. A.push_back(a);
  39. B.push_back(b);
  40. }
  41. long long get(long long x)
  42. {
  43. int i = upper_bound(inter.begin(), inter.end(), (long double)x) - inter.begin() - 1;
  44. return A[i] * x + B[i];
  45. }
  46. } dp[330];
  47. long long cur[N + 1], lazy[330], a[330];
  48. int n;
  49. void add(int l, int r, long long x, long long y, int st)
  50. {
  51. int bl = (l + block - 1)/block, br = (r + block - 1)/block;
  52. if (bl == br)
  53. {
  54. for (int i = (bl - 1) * block + 1; i <= min(n, bl * block); ++ i)
  55. {
  56. cur[i] += lazy[bl] + 1LL * i * a[bl];
  57. }
  58. lazy[bl] = a[bl] = 0;
  59. for (int i = l; i <= r; ++ i)
  60. {
  61. cur[i] += x + 1LL * (i - st) * y;
  62. }
  63. dp[bl].Clear();
  64. for (int i = (bl - 1) * block + 1; i <= min(n, bl * block); ++ i)
  65. {
  66. dp[bl].add(i, cur[i]);
  67. }
  68. return ;
  69. }
  70. for (int i = bl + 1; i < br; ++ i)
  71. {
  72. lazy[i] += x - 1LL * st * y;
  73. a[i] += y;
  74. }
  75. add(l, bl * block, x, y, st);
  76. add((br - 1) * block + 1, r, x, y, st);
  77. }
  78. long long cal(int i)
  79. {
  80. int bl = (i + block - 1)/block;
  81. return cur[i] + a[bl] * i + lazy[bl];
  82. }
  83. long long get(int l, int r)
  84. {
  85. int bl = (l + block - 1)/block, br = (r + block - 1)/block;
  86. long long ret = 0;
  87. if (bl == br)
  88. {
  89. for (int i = l; i <= r; ++ i)
  90. {
  91. ret = max(ret, cal(i));
  92. }
  93. return ret;
  94. }
  95. for (int i = bl + 1; i < br; ++ i)
  96. {
  97. ret = max(ret, dp[i].get(a[i]) + lazy[i]);
  98. }
  99. ret = max(ret, get(l, bl * block));
  100. ret = max(ret, get((br - 1) * block + 1, r));
  101. return ret;
  102. }
  103. void read()
  104. {
  105. cin >> n;
  106. for (int i = 1; i <= n; ++ i)
  107. {
  108. cin >> cur[i];
  109. }
  110. for (int i = 1; i <= (n + block - 1)/block; ++ i)
  111. {
  112. for (int j = (i - 1) * block + 1; j <= min(n, i * block); ++ j)
  113. {
  114. dp[i].add(j, cur[j]);
  115. }
  116. }
  117. }
  118. void solve()
  119. {
  120. int q;
  121. cin >> q;
  122. while(q--)
  123. {
  124. int t;
  125. cin >> t;
  126. if (t == 1)
  127. {
  128. int l, r;
  129. cin >> l >> r;
  130. cout << get(l, r) << '\n';
  131. }
  132. else
  133. {
  134. int l, r;
  135. long long x, y;
  136. cin >> l >> r >> x >> y;
  137. add(l, r, x, y, l);
  138. }
  139. /*for (int i = 1; i <= n; ++ i)
  140. {
  141. cerr << cal(i) << ' ';
  142. }
  143. cerr << '\n';*/
  144. }
  145. }
  146. int main()
  147. {
  148. ios_base::sync_with_stdio(false);
  149. cin.tie(nullptr);
  150. if (fopen(TASK".INP", "r"))
  151. {
  152. freopen(TASK".INP", "r", stdin);
  153. //freopen(TASK".OUT", "w", stdout);
  154. }
  155. int t = 1;
  156. bool typetest = false;
  157. if (typetest)
  158. {
  159. cin >> t;
  160. }
  161. for (int __ = 1; __ <= t; ++ __)
  162. {
  163. //cout << "Case " << __ << ": ";
  164. read();
  165. solve();
  166. }
  167. }
  168.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement