ProgMe

Untitled

Jun 5th, 2020
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <deque>
  3. #include <math.h>
  4. #include <cmath>
  5. #include <algorithm>
  6.  
  7. #define int int64_t
  8.  
  9. using namespace std;
  10. const int N = 1e5;
  11.  
  12. typedef deque <int> di;
  13.  
  14. class SegmentTree
  15. {
  16. public:
  17. int n;
  18. int32_t tree [4 * N + 1] = {};
  19. void tree_build(di a, int v, int l, int r)
  20. {
  21. if (l == r)
  22. {
  23. tree [v] = a [l];
  24. return;
  25. }
  26. int mid = (l + r) / 2;
  27. tree_build(a, v * 2, l, mid);
  28. tree_build(a, v * 2 + 1, mid + 1, r);
  29. tree [v] = tree [v * 2] + tree [v * 2 + 1];
  30. }
  31. void tree_build(int a [], int v, int l, int r)
  32. {
  33. if (l == r)
  34. {
  35. tree[v] = a[l];
  36. return;
  37. }
  38. int mid = (l + r) / 2;
  39. tree_build (a, v * 2, l, mid);
  40. tree_build (a, v * 2 + 1, mid + 1, r);
  41. tree [v] = tree [v * 2] + tree [v * 2 + 1];
  42. }
  43. void tree_update(int v, int l, int r, int where, int what)
  44. {
  45. if (l == r)
  46. {
  47. tree [v] = what;
  48. return;
  49. }
  50. int mid = (l + r) / 2;
  51. if (mid >= where)
  52. tree_update(v * 2, l, mid, where, what);
  53. else
  54. tree_update(v * 2 + 1, mid + 1, r, where, what);
  55. tree [v] = tree [v * 2] + tree [v * 2 + 1];
  56. }
  57. int tree_request(int v, int l, int r, int rl, int rr)
  58. {
  59. if (rl > rr)
  60. return 0;
  61. if (l == rl && r == rr)
  62. return tree [v];
  63. int mid = (l + r) / 2;
  64. return tree_request(v * 2, l, mid, rl, min(mid, rr)) + tree_request(v * 2 + 1, mid + 1, r, max(mid + 1, rl), rr);
  65. }
  66. };
  67.  
  68. class SegmentTreemx
  69. {
  70. public:
  71. int n;
  72. int32_t tree [4 * N + 1] = {};
  73. void tree_build(di a, int v, int l, int r)
  74. {
  75. if (l == r)
  76. {
  77. tree [v] = a [l];
  78. return;
  79. }
  80. int mid = (l + r) / 2;
  81. tree_build(a, v * 2, l, mid);
  82. tree_build(a, v * 2 + 1, mid + 1, r);
  83. tree [v] = max(tree [v * 2], tree [v * 2 + 1]);
  84. }
  85. void tree_build(int a [], int v, int l, int r)
  86. {
  87. if (l == r)
  88. {
  89. tree[v] = a[l];
  90. return;
  91. }
  92. int mid = (l + r) / 2;
  93. tree_build (a, v * 2, l, mid);
  94. tree_build (a, v * 2 + 1, mid + 1, r);
  95. tree [v] = max(tree [v * 2], tree [v * 2 + 1]);
  96. }
  97. void tree_update(int v, int l, int r, int where, int what)
  98. {
  99. if (l == r)
  100. {
  101. tree [v] = what;
  102. return;
  103. }
  104. int mid = (l + r) / 2;
  105. if (mid >= where)
  106. tree_update(v * 2, l, mid, where, what);
  107. else
  108. tree_update(v * 2 + 1, mid + 1, r, where, what);
  109. tree [v] = max(tree [v * 2], tree [v * 2 + 1]);
  110. }
  111. int tree_request(int v, int l, int r, int rl, int rr)
  112. {
  113. if (rl > rr)
  114. return 0;
  115. if (l == rl && r == rr)
  116. return tree [v];
  117. int mid = (l + r) / 2;
  118. return max(tree_request(v * 2, l, mid, rl, min(mid, rr)), tree_request(v * 2 + 1, mid + 1, r, max(mid + 1, rl), rr));
  119. }
  120. };
  121.  
  122. int32_t main() {
  123. int n;
  124. cin >> n;
  125. int a [n];
  126. for (auto &i: a)
  127. cin >> i;
  128. SegmentTree sum;
  129. SegmentTreemx mx;
  130. sum.tree_build(a, 1, 0, n - 1);
  131. mx.tree_build(a, 1, 0, n - 1);
  132. int q;
  133. cin >> q;
  134. while (q--)
  135. {
  136. int l, r;
  137. cin >> l >> r;
  138. cout << sum.tree_request(1, 0, n - 1, l, r) - mx.tree_request(1, 0, n - 1, l, r) << "\n";
  139. }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment