Advertisement
shamiul93

Spoj GSS1

Apr 20th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <iostream>
  2. #include<algorithm>
  3. #include <cstdio>
  4. #define ll                                      long long
  5. #define fi                                      freopen("in.txt", "r", stdin)
  6. #define fo                                      freopen("out.txt", "w", stdout)
  7. #define m0(a) memset(a , 0 , sizeof(a))
  8. #define m1(a) memset(a , -1 , sizeof(a))
  9.  
  10. #define mx 50000+3
  11. using namespace std;
  12.  
  13. int i, j  ;
  14.  
  15. class node
  16. {
  17. public:
  18.     int prefix ;
  19.     int suffix ;
  20.     int sum ;
  21.     int result ;
  22.  
  23.     node(int tem)
  24.     {
  25.         prefix = suffix = sum = result = tem ;
  26.     }
  27.  
  28.     node()
  29.     {
  30.         prefix = suffix = sum = result = -1000000 ;
  31.     }
  32. };
  33.  
  34.  
  35. node combineChild(node a, node b)
  36. {
  37.     node t ;
  38.  
  39.     t.sum = a.sum + b.sum ;
  40.     t.prefix = max( a.prefix, (a.sum + b.prefix) ) ;
  41.     t.suffix = max( b.suffix, (b.sum + a.suffix) ) ;
  42.     t.result = max( a.suffix + b.prefix, max(a.result, b.result)) ;
  43.  
  44.     return t ;
  45. }
  46.  
  47.  
  48. int A[mx] ;
  49. node seg[mx*4] ;
  50.  
  51.  
  52. node buildTree(int lo, int hi, int sp)
  53. {
  54.     if(lo == hi)
  55.     {
  56.         node n ;
  57.         n = node(A[lo]) ;
  58.         seg[sp] = n ;
  59.         return seg[sp] ;
  60.     }
  61.  
  62.     int mid ;
  63.     mid = (lo+hi) / 2 ;
  64.  
  65.     node left = buildTree(lo, mid, 2*sp+1) ;
  66.     node right = buildTree(mid + 1, hi, 2*sp + 2) ;
  67.  
  68.     seg[sp] = combineChild(left, right) ;
  69.  
  70.     return seg[sp] ;
  71. }
  72.  
  73.  
  74. node query(int lo, int hi, int sp)
  75. {
  76.     if(hi < i || lo > j)
  77.     {
  78.         node n;
  79.  
  80.         return n ;
  81.     }
  82.     if(lo >= i && hi <= j)
  83.     {
  84.         return seg[sp] ;
  85.     }
  86.  
  87.     int mid ;
  88.     mid = ( lo + hi ) / 2 ;
  89.  
  90.     node l, r ;
  91.  
  92.     l = query(lo, mid, 2*sp+1) ;
  93.     r = query(mid + 1, hi, 2*sp + 2 ) ;
  94.  
  95.     return combineChild(l, r) ;
  96. }
  97.  
  98. int main()
  99. {
  100.     for(int ii = 0 ; ii < mx ; ii++)
  101.     {
  102.         A[ii] = -1000000 ;
  103.     }
  104.  
  105.     int N ;
  106.     scanf("%d",&N) ;
  107.     for(int ii = 0 ; ii < N ; ii++)
  108.     {
  109.         scanf("%d",&A[ii]) ;
  110.     }
  111.  
  112.     buildTree(0, N-1, 1) ;
  113.  
  114.     int M ;
  115.     scanf("%d",&M) ;
  116.  
  117.     while(M--)
  118.     {
  119.         scanf("%d %d", &i, &j) ;
  120.         i-- ;
  121.         j-- ;
  122.         int ans ;
  123.  
  124.         ans = query(0, N-1, 1).result ;
  125.         printf("%d\n",ans);
  126.     }
  127.     return 0 ;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement