Advertisement
a_pramanik

segment tree 2nd max/ spoj KGGS - Maximum Sum

Sep 20th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define pb push_back
  5. #define ll long long int
  6. #define inf 2000000000
  7. #define pi (2.0*acos(0.0))
  8. #define vsort(v)   sort(v.begin(),v.end())
  9. #define ull unsigned long long int
  10. #define mem(a, b) memset(a, b, sizeof a)
  11. #define cf 100009
  12. int a[cf], m1, m2;
  13.  
  14. struct data
  15. {
  16.     int val, in;
  17.     data(){
  18.     val = 0, in =0;
  19.     }
  20. }tr[3*cf];
  21.  
  22.  
  23. void build(int node, int s, int e)
  24. {
  25.     if(s==e){
  26.         tr[node].val=a[e];
  27.         tr[node].in=e;
  28.         return;
  29.     }
  30.  
  31.     int mid = (s+e)/2;
  32.  
  33.     build(node*2, s, mid);
  34.     build(node*2+1, mid+1, e);
  35.  
  36.     if(tr[node*2].val>tr[node*2+1].val){
  37.         tr[node].val=tr[node*2].val;
  38.         tr[node].in=tr[node*2].in;
  39.     }
  40.     else{
  41.         tr[node].val=tr[node*2+1].val;
  42.         tr[node].in=tr[node*2+1].in;
  43.     }
  44.  
  45.  
  46. }
  47.  
  48. void update(int node, int s, int e, int ind, int value)
  49. {
  50.     if(ind>e || s>ind)return;
  51.  
  52.     if(s==ind && e==ind){
  53.         tr[node].val=value;
  54.         tr[node].in=ind;
  55.         return;
  56.     }
  57.  
  58.     int mid = (s+e)/2;
  59.  
  60.     update(node*2, s, mid, ind, value);
  61.     update(node*2+1, mid+1, e, ind, value);
  62.  
  63.     if(tr[node*2].val>tr[node*2+1].val){
  64.         tr[node].val=tr[node*2].val;
  65.         tr[node].in=tr[node*2].in;
  66.     }
  67.     else{
  68.         tr[node].val=tr[node*2+1].val;
  69.         tr[node].in=tr[node*2+1].in;
  70.     }
  71.  
  72. }
  73.  
  74. int query(int node, int s, int e, int l, int r)
  75. {
  76.     if(l>e || s>r)return 0;
  77.  
  78.     if(s>=l && e<= r){
  79.             /*printf("REC>> %d\n", node);*/
  80.         return node;
  81.     }
  82.  
  83.     int mid = (s+e)/2;
  84.  
  85.     int c = query(node*2, s, mid, l ,r);
  86.     int d = query((node*2)+1, mid+1, e, l ,r);
  87.     /*printf("REC>> %d %d\n", c, d);*/
  88.     if(tr[c].val>tr[d].val)return c;
  89.  
  90.     else return d;
  91.  
  92. }
  93.  
  94.  
  95. int main()
  96.  
  97. {
  98.         int n, q, i, j, k, x, y,ind, val, m1, m2, ans1, ans2;
  99.         char ch;
  100.         while(scanf("%d", &n)==1){
  101.  
  102.             for(i=1; i<=n; i++)scanf("%d", &a[i]);
  103.  
  104.             build(1, 1, n);
  105.  
  106.             scanf("%d", &q);
  107.  
  108.             for(j=1; j<=q; j++){
  109.                 cin>>ch;
  110.                 if(ch=='U'){
  111.                     cin>>ind>>val;
  112.                     update(1, 1, n, ind, val);
  113.                 }
  114.  
  115.                 else{
  116.                     cin>>x>>y;
  117.                     m1 = query(1, 1, n, x, y);
  118.                     //printf("%d\n", m1);
  119.                     ans1=tr[m1].val;
  120.                     m1 = tr[m1].in;
  121.                     //printf("%d\n", m1);
  122.                     update(1, 1, n, m1, -1);
  123.                     m2 = query(1, 1, n, x, y);
  124.                     ans2 = tr[m2].val;
  125.                     update(1, 1, n, m1, ans1);
  126.                     printf("%d\n", ans1+ans2);
  127.                 }
  128.  
  129.             }
  130.  
  131.         }
  132.         return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement