Advertisement
a53

Cartita

a53
Aug 21st, 2021
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. ///O(U + N*log2N + Q)
  2.  
  3.  
  4. #include <fstream>
  5. #include <cassert>
  6.  
  7. using namespace std;
  8.  
  9. ifstream f("cartita.in");
  10. ofstream g("cartita.out");
  11.  
  12. const int NMAX = 1e5 + 1, LOGMAX = 17;
  13. const long long INF = 1LL * 1e18;
  14.  
  15. int N, U, Q;
  16.  
  17. long long A[NMAX];
  18.  
  19. long long Sum_X = 0, Sum_K = 0;
  20. long long Diff = 0;
  21.  
  22. int Log2[NMAX];
  23. long long rmq[LOGMAX][NMAX];
  24.  
  25. void Read ()
  26. {
  27. f >> N;
  28. assert(1 <= N && N <= 1e5);
  29.  
  30. for(int i = 1; i <= N; ++i)
  31. f >> A[i], assert(1 <= A[i] && A[i] <= N);
  32.  
  33. return;
  34. }
  35.  
  36. void Update ()
  37. {
  38. int i = 0, x = 0, K = 0;
  39. f >> i >> x >> K;
  40. assert(1 <= i && i <= N);
  41. assert(1 <= x && x <= 400);
  42. assert(-21 <= K && K <= 21 && K);
  43. /// assert(1 <= x && x <= 1e3);
  44. /// assert(1 <= K && K <= 21);
  45.  
  46. Sum_X += 1LL * x, Sum_K += 1LL * K;
  47.  
  48. Diff += 1LL * i * K;
  49.  
  50. return;
  51. }
  52.  
  53. long long my_min (long long a, long long b)
  54. {
  55. return ((a < b) ? a : b);
  56. }
  57.  
  58. void Initialize ()
  59. {
  60. Log2[1] = 0;
  61.  
  62. for(int i = 1; i <= N; ++i)
  63. {
  64. if(i > 1)
  65. Log2[i] = 1 + Log2[(i >> 1)];
  66.  
  67. rmq[0][i] = A[i];
  68. }
  69.  
  70. for(int i = 1; i <= Log2[N]; ++i)
  71. {
  72. int Lg = (1 << i);
  73.  
  74. for(int j = 1; j <= (N - Lg + 1); ++j)
  75. rmq[i][j] = my_min(rmq[i - 1][j], rmq[i - 1][j + (Lg >> 1)]);
  76. }
  77.  
  78. return;
  79. }
  80.  
  81. void Updates ()
  82. {
  83. f >> U;
  84. assert(1 <= U && U <= 3e5);
  85.  
  86. while(U--)
  87. Update();
  88.  
  89. for(int i = 1; i <= N; ++i)
  90. A[i] += 1LL * Sum_X + 1LL * i * Sum_K - Diff;
  91.  
  92. Initialize();
  93.  
  94. return;
  95. }
  96.  
  97. long long Query_Min (int left, int right)
  98. {
  99. int k = Log2[(right - left + 1)];
  100.  
  101. return my_min(rmq[k][left], rmq[k][right - (1 << k) + 1]);
  102. }
  103.  
  104. void Query ()
  105. {
  106. int left = 0, right = 0;
  107. f >> left >> right;
  108. assert(1 <= left && left <= right && right <= N);
  109.  
  110. g << Query_Min(left, right) << '\n';
  111.  
  112. return;
  113. }
  114.  
  115. void Queries ()
  116. {
  117. f >> Q;
  118. assert(1 <= Q && Q <= 2e5);
  119.  
  120. while(Q--)
  121. Query();
  122.  
  123. return;
  124. }
  125.  
  126. int main()
  127. {
  128. Read();
  129.  
  130. Updates();
  131.  
  132. Queries();
  133.  
  134. return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement