Guest User

Untitled

a guest
Jun 6th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define max(a,b) a>b?a:b
  4. struct node
  5. {
  6. long long int prefix,suffix,total,maxm;
  7. };
  8. node segtree[4*50010];
  9. vector<int> tree;
  10. void build(int s,int e,int index)
  11. {
  12. if(s==e)
  13. {
  14. segtree[index].prefix = segtree[index].suffix = segtree[index].total = segtree[index].maxm = tree[s];
  15. return;
  16. }
  17. int mid =(s+e)/2;
  18. build(s,mid,2*index+1);
  19. build(mid+1,e,2*index+2);
  20. int left = 2*index+1;
  21. int right = 2*index+2;
  22. segtree[index].total = segtree[left].total+segtree[right].total;
  23. segtree[index].prefix = max(segtree[left].prefix,segtree[right].prefix+segtree[left].total);
  24. segtree[index].suffix = max(segtree[right].suffix,segtree[left].suffix+segtree[right].total);
  25. segtree[index].maxm = max(segtree[index].suffix,max(segtree[index].prefix,max(max(segtree[left].maxm,segtree[right].maxm),segtree[left].suffix+segtree[right].prefix)));
  26. return;
  27. }
  28.  
  29. node query(int s,int e,int qs,int qe,int index)
  30. {
  31. node res;
  32. res.prefix = res.suffix = res.maxm = res.total = LONG_MIN;
  33. if(e<qs || s>qe)
  34. {
  35. return res;
  36. }
  37. else if(qs<=s && qe>=e)
  38. {
  39. return segtree[index];
  40. }
  41. int l = 2*index+1;
  42. int r = 2*index+2;
  43. int mid = (s+e)/2;
  44. if (qs > mid)
  45. return query(mid+1, e, qs, qe,r);
  46. if (qe <= mid)
  47. return query(s, mid, qs, qe,l);
  48. node left = query(s,mid,qs,qe,l);
  49. node right = query(mid+1,e,qs,qe,r);
  50. res.total = left.total+right.total;
  51. res.prefix = max(left.prefix,right.prefix+left.total);
  52. res.suffix = max(right.suffix,left.suffix+right.total);
  53. res.maxm = max(res.suffix,max(res.prefix,max(max(left.maxm,right.maxm),left.suffix+right.prefix)));
  54. return res;
  55. }
  56.  
  57. int main()
  58. {
  59. int n;
  60. cin>>n;
  61. long long int x;
  62. for(int i=0;i<n;i++)
  63. {
  64. cin>>x;
  65. tree.push_back(x);
  66. }
  67. build(0,n-1,0);
  68. int m;
  69. cin>>m;
  70. int s,e;
  71. while(m--)
  72. {
  73. cin>>s>>e;
  74. cout<<query(0,n-1,--s,--e,0).maxm<<endl;
  75. }
  76. }
Add Comment
Please, Sign In to add comment