Advertisement
Guest User

Untitled

a guest
Feb 24th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. /*===============*\
  2. |  ID: TMANDZU    |
  3. |    LANG: C++    |
  4. \*===============*/
  5. //Tornike Mandzulashvili
  6. //#pragma comment(linker,"/STACK:256000000")
  7. #include <time.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <algorithm>
  11. #include <stack>
  12. #include <math.h>
  13. #include <vector>
  14. #include <string>
  15. #include <map>
  16. #include <queue>
  17. #include <iostream>
  18. #include <set>
  19. #include <cstring>
  20.  
  21. #define EPS 0.000000001
  22. #define Pi 3.1415926535897932384626433832795028841971
  23. #define hash1 1000003
  24. #define hash2 1000033
  25. #define md 1000000007
  26. #define INF 1000000500
  27. #define mp make_pair
  28. #define pb push_back
  29. #define S size()
  30. #define MX(aa,bb) (aa>bb?aa:bb)
  31. #define MN(aa,bb) (aa<bb?aa:bb)
  32. #define fi first
  33. #define se second
  34. #define PI pair < int,int >
  35. #define REP(i,a,n) for(i=a;i<n;i++)
  36. #define sc scanf
  37. #define pt printf
  38. #define big long long
  39. #define VI vector <int>
  40. #define DID (long long)
  41.  
  42.  
  43. using namespace std;
  44.  
  45. const int T=100005;
  46. int A[T];
  47. int Q,x,y,i,N;
  48. char ch;
  49. PI per,cur;
  50.  
  51. struct node
  52. {
  53.     node *l,*r;
  54.     pair <int,int> mx;
  55.  
  56.     node (int val)
  57.     : l(NULL) ,r(NULL),mx(mp(-1,-1))
  58.     { }
  59.  
  60.     node (node *x,node *y)
  61.     : l(x) ,r(y),mx(mp(-1,-1))
  62.     {
  63.          if (l)
  64.          mx=max(mx,l->mx);
  65.          if (r)
  66.          mx=max(mx,r->mx);
  67.     }
  68. };
  69.  
  70. node* build(int a,int b)
  71. {
  72.         if (a==b) return new node(A[a]);
  73.         int mid=(a+b)>>1;
  74.         return new node
  75.         (
  76.             build(a,mid) , build(mid+1,b)
  77.         );
  78. }
  79.  
  80. node* update(node *v,int l,int r,int pos,int delta)
  81. {
  82.     if (l==r)
  83.     {
  84.         v->mx.fi=delta;
  85.         v->mx.se=l;
  86.         return v;
  87.     }
  88.     int mid=(l+r)>>1;
  89.     if (pos<=mid)
  90.     v->l=update(v->l,l,mid,pos,delta);else
  91.     v->r=update(v->r,mid+1,r,pos,delta);
  92.  
  93.     v->mx=max(v->l->mx,v->r->mx);
  94.     return v;
  95. }
  96.  
  97. PI getmax(node *v,int l,int r,int a,int b)
  98. {
  99.    if (l>b || a>r) return mp(-1,-1);
  100.    if (a<=l && r<=b)
  101.    {
  102.        return v->mx;
  103.    }
  104.    return max(getmax(v->l,l,(l+r)/2,a,b),getmax(v->r,(l+r)/2+1,r,a,b));
  105. }
  106.  
  107. node *root;
  108.  
  109. main()
  110. {
  111.    // freopen("text.in","r",stdin);   freopen("text.out","w",stdout);
  112.  
  113.     scanf("%d\n",&N);
  114.     for (i=0;i<N;i++)
  115.     scanf("%d",&A[i]);
  116.     scanf("\n");
  117.  
  118.     root=build(0,N-1);
  119.     for (i=0;i<N;i++)
  120.     update(root,0,N-1,i,A[i]);
  121.  
  122.     scanf("%d\n",&Q);
  123.     while (Q--)
  124.     {
  125.         scanf("%c",&ch);
  126.         if (ch=='U')
  127.         {
  128.             scanf(" %d %d\n",&i,&x);
  129.             i--;
  130.             root=update(root,0,N-1,i,x);
  131.         }else
  132.         {
  133.             scanf(" %d %d\n",&x,&y);
  134.             x--;y--;
  135.  
  136.             per=getmax(root,0,N-1,x,y);
  137.             update(root,0,N-1,per.se,-1);
  138.             cur=getmax(root,0,N-1,x,y);
  139.             update(root,0,N-1,per.se,per.fi);
  140.  
  141.      //       cout<<per.fi<<" "<<cur.fi<<endl;
  142.  
  143.             printf("%d\n",per.fi+cur.fi);
  144.         }
  145.     }
  146.  
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement