fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 2e5 + 5;
  12.  
  13. int n, q;
  14. int a[N];
  15.  
  16. struct Node {
  17. ll max_subarray, max_pref, max_suf, sum;
  18.  
  19. Node() {
  20. max_subarray = max_pref = max_suf = sum = 0;
  21. }
  22.  
  23. Node(ll x) {
  24. max_subarray = max_pref = max_suf = max(0ll, x);
  25. sum = x;
  26. }
  27.  
  28. Node operator+(const Node& other) const {
  29. Node res;
  30. res.max_subarray = max({max_subarray, other.max_subarray, max_suf + other.max_pref});
  31. res.max_pref = max(max_pref, sum + other.max_pref);
  32. res.max_suf = max(other.max_suf, other.sum + max_suf);
  33. res.sum = sum + other.sum;
  34. return res;
  35. }
  36. };
  37.  
  38. Node seg[4 * N];
  39.  
  40. void build(int id, int l, int r) {
  41. if (l == r) {
  42. seg[id] = Node(a[l]);
  43. return;
  44. }
  45. int mid = (l + r) >> 1;
  46. build(id * 2, l, mid);
  47. build(id * 2 + 1, mid + 1, r);
  48. seg[id] = seg[id * 2] + seg[id * 2 + 1];
  49. }
  50.  
  51. Node get(int id, int l, int r, int u, int v) {
  52. if (l > v || r < u) return Node();
  53. if (u <= l && r <= v) return seg[id];
  54. int mid = (l + r) >> 1;
  55. return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
  56. }
  57.  
  58. int main() {
  59. ios::sync_with_stdio(false);
  60. cin.tie(nullptr);
  61. cin >> n >> q;
  62. for (int i = 1; i <= n; i++) cin >> a[i];
  63.  
  64. build(1, 1, n);
  65.  
  66. while (q--) {
  67. int l, r;
  68. cin >> l >> r;
  69. Node ans = get(1, 1, n, l, r);
  70. cout << ans.max_subarray << '\n';
  71. }
  72. }
Success #stdin #stdout 0.01s 28616KB
stdin
8 4
2 5 1 -2 3 -1 -7 1
2 4
2 5
6 7
4 8
stdout
6
7
0
3