Advertisement
MegaVerkruzo

cdf Задача C

Sep 11th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const long long INF = 1e9;
  8.  
  9. void build(vector<long long>& z, const vector<long long>& a, int l, int r, int now) {
  10. if (l > r || l < 0 || r >= a.size()) {
  11. return;
  12. }
  13. if (l == r) {
  14. z[now] = a[l];
  15. return;
  16. }
  17. int mid = (l + r) / 2;
  18. build(z, a, l, mid, now * 2);
  19. build(z, a, mid + 1, r, now * 2 + 1);
  20. z[now] = min(z[now * 2], z[now * 2 + 1]);
  21. }
  22.  
  23. long long query(vector<long long>& z, int l, int r, int a, int b, int now) {
  24. if (l > r || a > r || b < l) {
  25. return INF;
  26. }
  27. if (a <= l && r <= b) {
  28. return z[now];
  29. }
  30. if (l == r) {
  31. return INF;
  32. }
  33. int mid = (l + r) / 2;
  34. long long _1 = query(z, l, mid, a, b, now * 2);
  35. long long _2 = query(z, mid + 1, r, a, b, now * 2 + 1);
  36. return min(_1, _2);
  37. }
  38.  
  39. void add(vector<long long>& z, int l, int r, int a, int b, int now, int delta) {
  40. if (l > r || a > r || b < l) {
  41. return;
  42. }
  43. if (a <= l && r <= b) {
  44. if (l == r) {
  45. z[now] += delta;
  46. }
  47. else {
  48. int mid = (l + r) / 2;
  49. add(z, l, mid, a, b, now * 2, delta);
  50. add(z, mid + 1, r, a, b, now * 2 + 1, delta);
  51. z[now] += delta;
  52. }
  53. return;
  54. }
  55. if (l == r) {
  56. return;
  57. }
  58. int mid = (l + r) / 2;
  59. add(z, l, mid, a, b, now * 2, delta);
  60. add(z, mid + 1, r, a, b, now * 2 + 1, delta);
  61. z[now] = min(z[now * 2], z[now * 2 + 1]);
  62. }
  63.  
  64. void update(vector<long long>& z, int l, int r, int a, int b, int now, int value) {
  65. if (l > r || a > r || b < l) {
  66. return;
  67. }
  68. if (a <= l && r <= b) {
  69. if (l == r) {
  70. z[now] = value;
  71. }
  72. else {
  73. int mid = (l + r) / 2;
  74. update(z, l, mid, a, b, now * 2, value);
  75. update(z, mid + 1, r, a, b, now * 2 + 1, value);
  76. z[now] = value;
  77. }
  78. return;
  79. }
  80. if (l == r) {
  81. return;
  82. }
  83. int mid = (l + r) / 2;
  84. update(z, l, mid, a, b, now * 2, value);
  85. update(z, mid + 1, r, a, b, now * 2 + 1, value);
  86. z[now] = min(z[now * 2], z[now * 2 + 1]);
  87. }
  88.  
  89. int main()
  90. {
  91. int n;
  92. cin >> n;
  93. vector<long long> a(n);
  94. for (int i = 0; i < n; ++i) {
  95. cin >> a[i];
  96. }
  97. vector<long long> z(n * 2, 1e9);
  98. build(z, a, 0, n - 1, 1);
  99. string s;
  100. while (cin >> s) {
  101. if (s == "min") {
  102. int l, r;
  103. cin >> l >> r;
  104. l--;
  105. r--;
  106. cout << query(z, 0, n - 1, l, r, 1) << "\n";
  107. }
  108. else if (s == "set") {
  109. int l, r, value;
  110. cin >> l >> r >> value;
  111. l--;
  112. r--;
  113. update(z, 0, n - 1, l, r, 1, value);
  114. }
  115. else if (s == "add") {
  116. int l, r, value;
  117. cin >> l >> r >> value;
  118. l--;
  119. r--;
  120. add(z, 0, n - 1, l, r, 1, value);
  121. }
  122.  
  123. }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement