pawan_asipu

GSS3

Apr 11th, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define MAXI (1e6)
  5. #define N 50010
  6.  
  7. int n, a[N];
  8.  
  9. struct node{
  10. int sum, prefix, suffix, ans;
  11. };
  12.  
  13. node seg[5*N];
  14.  
  15. node data(int x)
  16. {
  17. node pawan;
  18. pawan.sum = pawan.prefix = pawan.suffix = pawan.ans = x;
  19. return pawan;
  20. }
  21.  
  22. node merge(node x, node y)
  23. {
  24. node pawan;
  25.  
  26. if(x.sum==-MAXI)
  27. {
  28. pawan.sum = y.sum;
  29. pawan.prefix = y.prefix;
  30. pawan.suffix = max(y.suffix , y.sum);
  31. pawan.ans = max(y.ans,y.prefix);
  32. }
  33. else
  34. {
  35. pawan.sum = x.sum + y.sum;
  36. pawan.prefix = max(x.prefix , x.sum + y.prefix);
  37. pawan.suffix = max(y.suffix , y.sum + x.suffix);
  38. pawan.ans = max(max(x.ans, y.ans) , x.suffix + y.prefix);
  39. }
  40.  
  41. return pawan;
  42. }
  43.  
  44. void build(int id, int l, int r)
  45. {
  46.  
  47. if(l==r)
  48. {
  49. seg[id] = data(a[l]);
  50. return ;
  51. }
  52. int mid = (l+r)/2;
  53. build(2 * id,l,mid);
  54. build(2 * id + 1,mid+1,r);
  55.  
  56. seg[id] = merge(seg[2*id], seg[2*id+1]);
  57.  
  58. }
  59.  
  60. void update(int x, int y, int id, int l, int r)
  61. {
  62.  
  63. if(l==r)
  64. {
  65. seg[id] = data(y);
  66. return ;
  67. }
  68.  
  69. int mid = (l+r)/2;
  70. if(x<=mid)
  71. update(x,y,2 * id,l,mid);
  72. else
  73. update(x,y,2 * id + 1,mid+1,r);
  74.  
  75. seg[id] = merge(seg[2*id], seg[2*id+1]);
  76. }
  77.  
  78. node segment(int x, int y, int id, int l, int r)
  79. {
  80. if(l>r or l > y || x > r)
  81. return data(-MAXI);
  82.  
  83. if(x <= l && r <= y)
  84. return seg[id];
  85.  
  86. int mid = (l+r)/2;
  87. node a = segment(x,y,2 * id,l,mid);
  88. node b = segment(x,y,2 * id + 1,mid+1,r);
  89.  
  90. return merge(a,b);
  91. }
  92.  
  93.  
  94. // Driver code to test above functions
  95. int32_t main()
  96. {
  97.  
  98. #ifndef ONLINE_JUDGE
  99. // for getting input from inpu.txt
  100. freopen("input.txt", "r", stdin);
  101. // for writing output to output.txt
  102. //freopen("output.txt", "w", stdout);
  103. #endif
  104.  
  105. ios_base::sync_with_stdio(0);
  106. cin.tie(NULL);
  107. cout.tie(NULL);
  108.  
  109. cin >> n;
  110. for(int i=0;i<n;i++)
  111. cin >> a[i];// a[i];
  112.  
  113. build(1,0,n-1);
  114.  
  115. int q;
  116. cin >> q;
  117. while(q--)
  118. {
  119. int type, x, y;
  120. cin >> type >> x >> y;
  121. x--;y--;
  122. if(type==0)
  123. {
  124. y++;
  125. update(x,y,1,0,n-1);
  126. }
  127. else
  128. cout << segment(x,y,1,0,n-1).ans << endl;
  129. }
  130.  
  131. return 0;
  132. }
Add Comment
Please, Sign In to add comment