Advertisement
adrienbrody2011

GSS1

Nov 29th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. struct Node {
  7.     int sum, leftsum, rightsum, maxsum;
  8. };
  9.  
  10. const int N = 50005, INF = 0x3FFFFFFF;
  11. int arr[N];
  12. Node nodes[4*N];
  13.  
  14. void build(int i, int l, int r) {
  15.     if (l == r) {
  16.         nodes[i] = {arr[l], arr[l], arr[l], arr[l]};
  17.         return;
  18.     }
  19.     build(2*i, l, (l+r)/2);
  20.     build(2*i+1, (l+r)/2+1, r);
  21.     nodes[i].sum = nodes[2*i].sum + nodes[2*i+1].sum;
  22.     nodes[i].leftsum = max(nodes[2*i].leftsum,
  23.                            nodes[2*i].sum + nodes[2*i+1].leftsum);
  24.     nodes[i].rightsum = max(nodes[2*i+1].rightsum,
  25.                             nodes[2*i+1].sum + nodes[2*i].rightsum);
  26.     nodes[i].maxsum = max(nodes[2*i].rightsum + nodes[2*i+1].leftsum,
  27.                           max(nodes[2*i].maxsum, nodes[2*i+1].maxsum));
  28. }
  29.  
  30. Node query(int i, int l, int r, int a, int b) {
  31.     if (a > r || b < l) {
  32.         return {0, -INF, -INF, -INF};
  33.     }
  34.     if (a <= l && r <= b) {
  35.         return nodes[i];
  36.     }
  37.     Node lnode = query(2*i, l, (l+r)/2, a, b);
  38.     Node rnode = query(2*i+1, (l+r)/2+1, r, a, b);
  39.     return {lnode.sum + rnode.sum,
  40.             max(lnode.leftsum, lnode.sum + rnode.leftsum),
  41.             max(rnode.rightsum, rnode.sum + lnode.rightsum),
  42.             max(lnode.rightsum + rnode.leftsum,
  43.                 max(lnode.maxsum, rnode.maxsum))};
  44. }
  45.  
  46. int main() {
  47.     int n;
  48.     scanf("%d", &n);
  49.     for (int i = 1; i <= n; i++) {
  50.         scanf("%d", &arr[i]);
  51.     }
  52.     build(1, 1, n);
  53.     int m;
  54.     scanf("%d", &m);
  55.     for (int i = 0; i < m; i++) {
  56.         int a, b;
  57.         scanf("%d %d", &a, &b);
  58.         printf("%d\n", query(1, 1, n, a, b).maxsum);
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement