Advertisement
dan_sml

Untitled

Oct 16th, 2022
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <algorithm>
  5.  
  6. template <typename T>
  7. T func(T a, T b) {
  8. return a + b;
  9. }
  10.  
  11. const int64_t INF = 1e15;
  12.  
  13. class SegmentTree {
  14. public:
  15. SegmentTree(std::vector<int64_t>& values) : size(values.size()), t(4 * size, 0), values(values), c( 4 * size, 0) {
  16. Build(0, 0, size, values);
  17. }
  18.  
  19. void ChangeVal(size_t pos, int64_t val) {
  20. ChangeValRec(0, 0, size, pos, val);
  21. }
  22.  
  23. void ChangeSeg(size_t ask_l, size_t ask_r, int64_t val) {
  24. ChangeSegRec(0, 0, size, ask_l, ask_r + 1, val);
  25. }
  26.  
  27. int64_t Ask(size_t ask_l, size_t ask_r) {
  28. return AskRec(0, 0, size, ask_l, ask_r + 1);
  29. }
  30.  
  31. int64_t GetKth(size_t k) {
  32. if (Ask(0, size) < k) {
  33. return -INF;
  34. }
  35. return GetKthRec(0, 0, size, k);
  36. }
  37.  
  38. int64_t GetKthOnSeg(size_t ask_l, size_t ask_r, size_t k) {
  39. int64_t previous = Ask(0, ask_l);
  40. int64_t prefix = Ask(0, ask_r + 1);
  41. if (prefix - previous < k) {
  42. return -INF;
  43. }
  44. return GetKth(previous + k);
  45. }
  46.  
  47. int64_t GetPref(int64_t sum) {
  48. if (sum == 0) {
  49. return 0;
  50. }
  51. if (Ask(0, size) < sum) {
  52. return INF;
  53. }
  54. return GetPrefRec(0, 0, size, sum);
  55. }
  56.  
  57. private:
  58. void Update(size_t v, int64_t l = 0, int64_t r = 0) {
  59. int64_t m = (r + l) / 2;
  60. t[v] = func(GetVal(2 * v + 1, l, m), GetVal(2 * v + 2, m, r));
  61. }
  62.  
  63. void Push(size_t v) {
  64. c[2 * v + 1] += c[v];
  65. c[2 * v + 2] += c[v];
  66. c[v] = 0;
  67. }
  68.  
  69. int64_t GetVal(size_t v, int64_t l, int64_t r) {
  70. return t[v] + c[v] * (r - l);
  71. }
  72.  
  73. void Build(size_t v, size_t l, size_t r, std::vector<int64_t>& values) {
  74. if (r - l == 1) {
  75. t[v] = values[l];
  76. return;
  77. }
  78. size_t m = (l + r) / 2;
  79. Build(2 * v + 1, l, m, values);
  80. Build(2 * v + 2, m, r, values);
  81. Update(v);
  82. }
  83.  
  84. void ChangeValRec(size_t v, size_t l, size_t r, size_t pos, int64_t val) {
  85. if (r - l == 1) {
  86. t[v] = val;
  87. return;
  88. }
  89. Push(v);
  90. size_t m = (l + r) / 2;
  91. if (pos < m) {
  92. ChangeValRec(2 * v + 1, l, m, val, pos);
  93. } else {
  94. ChangeValRec(2 * v + 2, m, r, val, pos);
  95. }
  96. Update(v, l, r);
  97. }
  98.  
  99. void ChangeSegRec(size_t v, size_t l, size_t r, size_t ask_l, size_t ask_r, int64_t val) {
  100. if (ask_r <= l || r <= ask_l) {
  101. return;
  102. }
  103. if (ask_l <= l && r <= ask_r) {
  104. c[v] += val;
  105. return;
  106. }
  107. Push(v);
  108. size_t m = (r + l) / 2;
  109. ChangeSegRec(2 * v + 1, l, m, ask_l, ask_r, val);
  110. ChangeSegRec(2 * v + 2, m, r, ask_l, ask_r, val);
  111. Update(v, l, r);
  112. }
  113.  
  114. int64_t AskRec(size_t v, size_t l, size_t r, size_t ask_l, size_t ask_r) {
  115. if (ask_r <= l || r <= ask_l) {
  116. return Neutral;
  117. }
  118. if (ask_l <= l && r <= ask_r) {
  119. return GetVal(v, l, r);
  120. }
  121. Push(v);
  122. size_t m = (l + r) / 2;
  123. int64_t ans = func(AskRec(2 * v + 1, l, m, ask_l, ask_r), AskRec(2 * v + 2, m, r, ask_l, ask_r));
  124. Update(v, l, r);
  125. return ans;
  126. }
  127.  
  128. int64_t GetKthRec(size_t v, size_t l, size_t r, size_t k) {
  129. if (r - l == 1) {
  130. return values[l];
  131. }
  132. Push(v);
  133. size_t m = (r + l) / 2;
  134. int64_t ans = 0;
  135. if (t[2 * v + 1] < k) {
  136. ans = GetKthRec(2 * v + 2, m, r, k - t[2 * v + 1]);
  137. } else {
  138. ans = GetKthRec(2 * v + 1, l, m, k);
  139. }
  140. Update(v);
  141. return ans;
  142. }
  143.  
  144. int64_t GetPrefRec(size_t v, size_t l, size_t r, int64_t sum) {
  145. if (r - l == 1) {
  146. return r;
  147. }
  148. size_t m = (r + l) / 2;
  149. if (GetVal(2 * v + 1, l, m) < sum) {
  150. return GetPrefRec(2 * v + 2, m, r, sum - t[2 * v + 1]);
  151. } else {
  152. return GetPrefRec(2 * v + 1, l, m, sum);
  153. }
  154. }
  155.  
  156. size_t size;
  157. std::vector<int64_t> t;
  158. std::vector<int64_t> c;
  159. std::vector<int64_t> values;
  160. int64_t Neutral = 0;
  161. };
  162.  
  163. struct Event {
  164. int64_t l = 0;
  165. int64_t r = 0;
  166. int64_t index = 0;
  167.  
  168. bool operator<(Event& other) const {
  169. return r < other.r;
  170. }
  171. };
  172.  
  173. std::istream& operator>>(std::istream& input, Event& e) {
  174. input >> e.l >> e.r;
  175. return input;
  176. }
  177.  
  178. int main() {
  179. size_t n;
  180. std::cin >> n;
  181. std::vector<int64_t> values(n);
  182. for (auto& val : values) {
  183. std::cin >> val;
  184. }
  185. SegmentTree tree(values);
  186. size_t q;
  187. std::cin >> q;
  188. while (q--) {
  189. int64_t type;
  190. std::cin >> type;
  191. if (type == 1) {
  192. int64_t l, r;
  193. std::cin >> l >> r;
  194. int64_t ans = tree.Ask(l, r);
  195. if (ans != INF) {
  196. std::cout << ans << '\n';
  197. } else {
  198. std::cout << "NONE\n";
  199. }
  200. } else {
  201. int64_t pos, x;
  202. std::cin >> pos >> x;
  203. tree.ChangeVal(pos, x);
  204. }
  205. }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement