fork(1) download
  1. /*
  2. *DIV 2 C.
  3. *LINK:
  4. *nilabja10201992
  5. */
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8. #define MAX 1<<16
  9. #define MAX2 MAX<<2
  10.  
  11. int A[MAX];
  12. struct node{
  13. int bestleftsum,bestrightsum,sum,bestsum;
  14. void merge(node &A, node &B){
  15. sum = A.sum + B.sum;
  16. bestleftsum = max(A.bestleftsum, A.sum + B.bestleftsum);
  17. bestrightsum = max(A.bestrightsum + B.sum, B.bestrightsum);
  18. bestsum = max(max(A.bestsum,B.bestsum),A.bestrightsum+B.bestleftsum);
  19. }
  20. void createLeaf(int val){
  21. sum=bestleftsum=bestrightsum=bestsum=val;
  22. }
  23. };
  24.  
  25. node T[MAX2];
  26.  
  27. void init(int index, int l,int r){
  28. if(l==r){
  29. T[index].createLeaf(A[l]);
  30. return;
  31. }
  32. else{
  33. int m = l + (r-l)/2;
  34. init(2*index,l,m);
  35. init(2*index+1,m+1,r);
  36. T[index].merge(T[2*index],T[2*index+1]);
  37. }
  38. }
  39.  
  40. void query(node& res, int l, int r, int u, int v, int index){
  41. if(u==l && v==r){
  42. res=T[index];
  43. return;
  44. }
  45. else{
  46. int m = l + (r-l)/2;
  47. if(m>=v)
  48. query(res,l,m,u,v,2*index);
  49. else if(m<u)
  50. query(res,m+1,r,u,v,2*index+1);
  51. else{
  52. node left,right;
  53. query(left,l,m,u,m,2*index);
  54. query(right,m+1,r,m+1,v,2*index+1);
  55. res.merge(left,right);
  56. }
  57. }
  58. }
  59. int main() {
  60. ios_base::sync_with_stdio(false);
  61. cin.tie(NULL);
  62. int n,t,x,y;
  63. cin>>n;
  64. for(int i=0;i<n;i++)
  65. cin>>A[i];
  66. init(1,0,n-1);
  67. cin>>t;
  68. node ans;
  69. while(t--){
  70. cin>>x>>y;
  71. query(ans,0,n-1,x-1,y-1,1);
  72. cout<<ans.bestsum<<endl;
  73. }
  74. //cout<<"Execution time : "<<tick();
  75. return 0;
  76. }
  77.  
Success #stdin #stdout 0s 20416KB
stdin
Standard input is empty
stdout
Standard output is empty