Advertisement
Guest User

Untitled

a guest
May 30th, 2016
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.85 KB | None | 0 0
  1. /*
  2.  
  3.     |-------|  |-------|  |-------|  |-------|  |
  4.     |          |       |          |  |       |  |
  5.     |          |       |          |  |       |  |
  6.     |-------|  |-------|          |  |-------|  |
  7.             |  |       |  |---|   |  |       |  |
  8.             |  |       |  |       |  |       |  |
  9.     |-------|  |       |  |-------|  |       |  |-------|
  10.  
  11. */
  12.  
  13. #include <bits/stdc++.h>
  14.  
  15. using namespace std;
  16.  
  17. #define read freopen("in.txt", "r", stdin)
  18. #define INF(ar) memset(ar,126,sizeof ar)
  19. #define SET(ar) memset(ar,-1,sizeof ar)
  20. #define rep(i,n) for(int i=0;i<(n);i++)
  21. #define CLR(ar) memset(ar,0,sizeof ar)
  22. #define din(a) scanf("%lf",&a)
  23. #define lin(a) scanf("%lld",&a)
  24. #define win(s) scanf("%s",s)
  25. #define iin(a) scanf("%d",&a)
  26. #define all(x) x.begin(),x.end()
  27. #define vlong long long
  28. #define linf (1LL<<62)
  29. #define pi 2*acos(0.0)
  30. #define pb push_back
  31. #define mp make_pair
  32. #define inf (1<<30)
  33. #define xx first
  34. #define yy second
  35.  
  36. //int dx[]={1,0,-1,0};                  int dy[]={0,1,0,-1};                // 4 Direction
  37. //int dx[]={1,1,0,-1,-1,-1,0,1};        int dy[]={0,1,1,1,0,-1,-1,-1};      // 8 direction
  38. //int dx[]={2,1,-1,-2,-2,-1,1,2};       int dy[]={1,2,2,1,-1,-2,-2,-1};     // Knight Direction
  39. //int dx[]={-1,-1,+0,+1,+1,+0};         int dy[]={-1,+1,+2,+1,-1,-2};       // Hexagonal Direction
  40.  
  41. int setBit(int n,int pos){return n|(1<<pos);}
  42. int resetBit(int n,int pos){return n&~(1<<pos);}
  43. bool checkBit(int n,int pos){return n&(1<<pos);}
  44. inline vlong bigmod(vlong p,vlong e,vlong M){vlong ret=1;while(e>0){if(e%2)ret=(ret*p)%M;p=(p*p)%M;e/=2;}return ret;}
  45. inline vlong power(vlong x,vlong y){vlong ans=1;while(y>0){if(y%2)ans*=x;x*=x;y/=2;}return ans;}
  46. template<class T> T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
  47. template<class T> T lcm(T a,T b){return a*(b/gcd(a,b));}
  48.  
  49. struct node
  50. {
  51.     int lmax, rmax, tsum, mmax;
  52. };
  53.  
  54. node t[3*50005];
  55. int n, q, a[50005];
  56.  
  57. node marge(node l, node r)
  58. {
  59.     node temp;
  60.     temp.lmax = max(l.lmax, l.tsum+r.lmax);
  61.     temp.rmax = max(r.rmax, r.tsum+l.rmax);
  62.     temp.mmax = max(max(l.mmax, r.mmax), l.rmax+r.lmax);
  63.     temp.tsum = l.tsum+r.tsum;
  64.     return temp;
  65. }
  66.  
  67. node makeNode(int a, int b, int c, int d)
  68. {
  69.     node temp;
  70.     temp.lmax = a;
  71.     temp.rmax = b;
  72.     temp.mmax = c;
  73.     temp.tsum = d;
  74.     return temp;
  75. }
  76.  
  77. void update(int num, int st, int ed, int in, int v)
  78. {
  79.     if(in < st || in > ed)
  80.     {
  81.         return;
  82.     }
  83.     if(st == ed)
  84.     {
  85.         t[num] = makeNode(v, v, v, v);
  86.         return;
  87.     }
  88.     int mid = (st+ed)/2;
  89.     update(num<<1, st, mid, in, v);
  90.     update(num<<1|1, mid+1, ed, in, v);
  91.     t[num] = marge(t[num<<1], t[num<<1|1]);
  92. }
  93.  
  94. node query(int num, int st, int ed, int i, int j)
  95. {
  96.     if(j < st || i > ed)
  97.     {
  98.         return makeNode(-(1<<30), -(1<<30), -(1<<30), -(1<<30));
  99.     }
  100.     if(st >= i && ed <= j)
  101.     {
  102.         /// printf("%d %d\n", num, t[num].mmax);
  103.         return t[num];
  104.     }
  105.     int mid = (st+ed)/2;
  106.     /// printf("%d %d\n", num, m.mmax);
  107.     return marge(query(num<<1, st, mid, i, j), query(num<<1|1, mid+1, ed, i, j));
  108. }
  109.  
  110. void build(int num, int st, int ed)
  111. {
  112.     if(st == ed)
  113.     {
  114.         t[num] = makeNode(a[st], a[st], a[st], a[st]);
  115.         /// printf("%d %d\n", num, t[num].mmax);
  116.         return;
  117.     }
  118.     int mid = (st+ed)/2;
  119.     build(num<<1, st, mid);
  120.     build(num<<1|1, mid+1, ed);
  121.     t[num] = marge(t[num<<1], t[num<<1|1]);
  122.     /// printf("%d %d\n", num, t[num].mmax);
  123. }
  124.  
  125. int main()
  126. {
  127.     iin(n);
  128.     rep(i, n)
  129.     {
  130.         iin(a[i + 1]);
  131.     }
  132.     build(1, 1, n);
  133.     iin(q);
  134.     rep(i, q)
  135.     {
  136.         int c, x, y;
  137.         iin(c);
  138.         if(c == 0)
  139.         {
  140.             iin(x); iin(y);
  141.             update(1, 1, n, x, y);
  142.         }
  143.         else
  144.         {
  145.             iin(x); iin(y);
  146.             printf("%d\n", query(1, 1, n, x, y).mmax);
  147.         }
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement