Advertisement
shamiul93

KGSS - Maximum Sum

Apr 22nd, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll                                      long long
  3. #define fi                                      freopen("in.txt", "r", stdin)
  4. #define fo                                      freopen("out.txt", "w", stdout)
  5. #define m0(a) memset(a , 0 , sizeof(a))
  6. #define m1(a) memset(a , -1 , sizeof(a))
  7. #define max3(a,b,c) max(a , max(b,c))
  8.  
  9. #define mx 100005
  10. using namespace std;
  11.  
  12.  
  13. class node
  14. {
  15. public:
  16.     int first ;
  17.     int second ;
  18.  
  19.     node(int tem)
  20.     {
  21.         first = tem ;
  22.         second = -1 ;
  23.     }
  24.     node()
  25.     {
  26.         first = second = -1 ;
  27.     }
  28. };
  29.  
  30. int A[mx] ;
  31. node seg[3*mx] ;
  32. int i, j, idx ;
  33.  
  34. node combineChild(node a, node b)
  35. {
  36.     node t ;
  37.     t.first = max(a.first, b.first) ;
  38.  
  39.  
  40.     if(t.first == a.first)
  41.     {
  42.         t.second = max3(a.second, b.first, b.second) ;
  43.     }
  44.     else
  45.     {
  46.         t.second = max3(a.second, a.first, b.second) ;
  47.     }
  48.     return t ;
  49. }
  50.  
  51.  
  52. node build(int lo, int hi, int sp)
  53. {
  54.     if(lo == hi)
  55.     {
  56.         node n(A[lo]) ;
  57.         seg[sp] = n ;
  58.         return seg[sp] ;
  59.     }
  60.     int mid ;
  61.     mid = (lo + hi) / 2 ;
  62.  
  63.     node l = build(lo, mid, 2*sp+1) ;
  64.     node r = build(mid + 1, hi, 2*sp + 2) ;
  65.  
  66.     seg[sp] = combineChild(l,r) ;
  67.     return seg[sp] ;
  68. }
  69.  
  70.  
  71. node query(int lo, int hi, int sp)
  72. {
  73.     if(lo > j || hi < i)
  74.     {
  75.         node n ;
  76.         return n ;
  77.     }
  78.     if(lo >= i && hi <= j)
  79.     {
  80.         return seg[sp] ;
  81.     }
  82.  
  83.     int mid ;
  84.     mid = (lo + hi) / 2 ;
  85.  
  86.     node l, r ;
  87.     l = query(lo, mid, 2*sp+1) ;
  88.     r = query(mid+1, hi, 2*sp+2) ;
  89.  
  90.     return combineChild(l, r) ;
  91. }
  92.  
  93.  
  94. node update(int lo, int hi, int sp, int val)
  95. {
  96.     if(lo > idx || hi < idx)
  97.     {
  98.         node n ;
  99.         return n ;
  100.     }
  101.     if(lo >= idx && hi <= idx)
  102.     {
  103.         node n(val) ;
  104.         seg[sp] = n ;
  105.         return seg[sp] ;
  106.     }
  107.  
  108.     int mid  ;
  109.     mid = (lo + hi) / 2 ;
  110.  
  111.     update(lo, mid, 2*sp+1, val);
  112.     update(mid+1, hi, 2*sp+2, val);
  113.  
  114.     seg[sp] = combineChild( seg[2*sp+1], seg[2*sp+2] ) ;
  115.     return seg[sp] ;
  116. }
  117.  
  118. int main()
  119. {
  120. //    fi ;
  121.     int N ;
  122.     scanf("%d",&N) ;
  123.  
  124.     for(int i = 0 ; i < N ; i++)
  125.     {
  126.         scanf("%d",&A[i]) ;
  127.     }
  128.     build(0 , N-1 , 0);
  129.     int Q ;
  130.     scanf("%d",&Q) ;
  131.     while(Q--)
  132.     {
  133.         char c ;
  134.         scanf(" %c",&c) ;
  135.         if(c == 'Q')
  136.         {
  137.             scanf("%d %d",&i, &j) ;
  138.             i-- ;
  139.             j-- ;
  140.             node n ;
  141.             n = query(0, N-1, 0) ;
  142.             int ans ;
  143. //            cout << n.first  << " " << n.second << endl ;
  144.             ans = n.first + n.second ;
  145.             printf("%d\n",ans);
  146.         }
  147.         else if(c == 'U')
  148.         {
  149.             int value ;
  150.             scanf("%d %d",&idx, &value) ;
  151.             idx-- ;
  152.             update(0, N-1, 0, value) ;
  153.         }
  154.     }
  155.     return 0 ;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement