Advertisement
shamiul93

GSS3 - Can you answer these queries III

Apr 21st, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. /**
  2.  
  3. @author - Rumman BUET CSE'15
  4. Rumman_Rulez
  5.  
  6. problem - GSS3 SPOJ
  7. Date - 22 / 4 / 17
  8.  
  9. Concept -
  10.     Segment Tree
  11.  
  12.     * If you haven't solved GSS1 yet , go and solve it first.
  13.     * GSS1 + Update = GSS3
  14.  
  15.  
  16. */
  17.  
  18.  
  19. #include <iostream>
  20. #include<algorithm>
  21. #include <cstdio>
  22. #define ll                                      long long
  23. #define fi                                      freopen("in.txt", "r", stdin)
  24. #define fo                                      freopen("out.txt", "w", stdout)
  25. #define m0(a) memset(a , 0 , sizeof(a))
  26. #define m1(a) memset(a , -1 , sizeof(a))
  27.  
  28. #define mx 50003
  29. using namespace std;
  30.  
  31. int i, j, idx ;
  32.  
  33. class node
  34. {
  35. public:
  36.     int prefix ;
  37.     int suffix ;
  38.     int sum ;
  39.     int result ;
  40.  
  41.     node(int tem)
  42.     {
  43.         prefix = suffix = sum = result = tem ;
  44.     }
  45.  
  46.     node()
  47.     {
  48.         prefix = suffix = sum = result = -1000000 ;
  49.     }
  50. };
  51.  
  52.  
  53. node combineChild(node a, node b)
  54. {
  55.     node t ;
  56.  
  57.     t.sum = a.sum + b.sum ;
  58.     t.prefix = max( a.prefix, (a.sum + b.prefix) ) ;
  59.     t.suffix = max( b.suffix, (b.sum + a.suffix) ) ;
  60.     t.result = max( a.suffix + b.prefix, max(a.result, b.result)) ;
  61.  
  62.     /**************/
  63.     t.result = max(t.result, t.prefix);
  64.     t.result = max(t.result, t.suffix);
  65.     t.result = max(t.result, t.sum);
  66.     /**************/
  67.     return t ;
  68. }
  69.  
  70.  
  71. int A[mx] ;
  72. node seg[mx*4] ;
  73.  
  74.  
  75. node buildTree(int lo, int hi, int sp)
  76. {
  77.     if(lo == hi)
  78.     {
  79.         node n ;
  80.         n = node(A[lo]) ;
  81.         seg[sp] = n ;
  82.         return seg[sp] ;
  83.     }
  84.  
  85.     int mid ;
  86.     mid = (lo+hi) / 2 ;
  87.  
  88.     node left = buildTree(lo, mid, 2*sp+1) ;
  89.     node right = buildTree(mid + 1, hi, 2*sp + 2) ;
  90.  
  91.     seg[sp] = combineChild(left, right) ;
  92.  
  93.     return seg[sp] ;
  94. }
  95.  
  96.  
  97. node query(int lo, int hi, int sp)
  98. {
  99.     if(hi < i || lo > j)
  100.     {
  101.         node n;
  102.         return n ;
  103.     }
  104.     if(lo >= i && hi <= j)
  105.     {
  106.         return seg[sp] ;
  107.     }
  108.  
  109.     int mid ;
  110.     mid = ( lo + hi ) / 2 ;
  111.  
  112.     node l, r ;
  113.  
  114.     l = query(lo, mid, 2*sp+1) ;
  115.     r = query(mid + 1, hi, 2*sp + 2 ) ;
  116.  
  117.     return combineChild(l, r) ;
  118. }
  119.  
  120.  
  121. node update(int lo, int hi, int sp, int val)
  122. {
  123.     if(hi < idx || lo > idx)
  124.     {
  125.         node n ;
  126.         return n ;
  127.     }
  128.  
  129.     if(lo >= idx && hi <= idx)
  130.     {
  131.         node n(val) ;
  132.         seg[sp] = n ;
  133.         return seg[sp] ;
  134.     }
  135.  
  136.     int mid ;
  137.     mid  = (lo + hi) / 2 ;
  138.  
  139.     update(lo, mid, 2*sp + 1, val) ;
  140.     update(mid + 1, hi, 2*sp + 2, val) ;
  141.  
  142.     seg[sp] = combineChild(seg[2*sp+1], seg[2*sp+2]) ;
  143.     return seg[sp] ;
  144. }
  145.  
  146.  
  147.  
  148. int main()
  149. {
  150.     for(int ii = 0 ; ii < mx ; ii++)
  151.     {
  152.         A[ii] = -1000000 ;
  153.     }
  154.  
  155.     int N ;
  156.     scanf("%d",&N) ;
  157.     for(int ii = 0 ; ii < N ; ii++)
  158.     {
  159.         scanf("%d",&A[ii]) ;
  160.     }
  161.  
  162.     buildTree(0, N-1, 0) ;
  163.  
  164.     int M ;
  165.     scanf("%d",&M) ;
  166.  
  167.     while(M--)
  168.     {
  169.         int c ;
  170.         scanf("%d",&c) ;
  171.  
  172.         if(c == 0)
  173.         {
  174.             int val ;
  175.             scanf("%d %d", &idx, &val) ;
  176.             idx -- ;
  177.  
  178.             update(0, N-1, 0, val) ;
  179.         }
  180.         else if(c == 1)
  181.         {
  182.             scanf("%d %d", &i, &j) ;
  183.             i-- ;
  184.             j-- ;
  185.             int ans ;
  186.  
  187.             ans = query(0, N-1, 0).result ;
  188.             printf("%d\n",ans);
  189.         }
  190.     }
  191.     return 0 ;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement