pawan_asipu

GSS1

Apr 11th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define MAXI (1e6+5)
  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. if(l>r)
  47. return;
  48.  
  49. if(l==r)
  50. {
  51. seg[id] = data(a[l]);
  52. return ;
  53. }
  54. int mid = (l+r)/2;
  55. build(2 * id,l,mid);
  56. build(2 * id + 1,mid+1,r);
  57.  
  58. seg[id] = merge(seg[2*id], seg[2*id+1]);
  59.  
  60. }
  61.  
  62. void update(int x, int y, int id, int l, int r)
  63. {
  64.  
  65. if(l==r)
  66. {
  67. seg[id] = data(y);
  68. return ;
  69. }
  70.  
  71. int mid = (l+r)/2;
  72. if(x<=mid)
  73. update(x,y,2 * id,l,mid);
  74. else
  75. update(x,y,2 * id + 1,mid+1,r);
  76.  
  77. seg[id] = merge(seg[2*id], seg[2*id+1]);
  78. }
  79.  
  80. node segment(int x, int y, int id, int l, int r)
  81. {
  82. if(l>r or l > y || x > r)
  83. return data(-MAXI);
  84.  
  85. if(x <= l && r <= y)
  86. return seg[id];
  87.  
  88. int mid = (l+r)/2;
  89. node a = segment(x,y,2 * id,l,mid);
  90. node b = segment(x,y,2 * id + 1,mid+1,r);
  91.  
  92. return merge(a,b);
  93. }
  94.  
  95.  
  96. // Driver code to test above functions
  97. int32_t main()
  98. {
  99.  
  100. #ifndef ONLINE_JUDGE
  101. // for getting input from inpu.txt
  102. freopen("input.txt", "r", stdin);
  103. // for writing output to output.txt
  104. //freopen("output.txt", "w", stdout);
  105. #endif
  106.  
  107. ios_base::sync_with_stdio(0);
  108. cin.tie(NULL);
  109. cout.tie(NULL);
  110.  
  111. cin >> n;
  112. for(int i=0;i<n;i++)
  113. cin >> a[i];// a[i];
  114.  
  115. build(1,0,n-1);
  116.  
  117. int q;
  118. cin >> q;
  119. while(q--)
  120. {
  121. int type, x, y;
  122. cin >> x >> y;
  123. x--;y--;
  124. // if(type==0)
  125. // {
  126. // y++;
  127. // update(x,y,1,0,n-1);
  128. // }
  129. // else
  130. cout << segment(x,y,1,0,n-1).ans << endl;
  131. }
  132.  
  133. return 0;
  134. }
Add Comment
Please, Sign In to add comment