Guest User

Untitled

a guest
Nov 20th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. const long long N=1000005;
  5. const long long MAX = 10000000000000000;
  6. int t,ti=0,n,arr[N];
  7. struct Node{
  8. long long mi,ma,ans;
  9. Node *lc,*rc;
  10. Node():mi(0),ma(0),ans(0),lc(NULL),rc(NULL){}
  11. void pull(){
  12. mi=min(lc->mi,rc->mi);
  13. ma=max(lc->ma,rc->ma);
  14. ans=max(max(lc->ans,rc->ans),rc->ma-lc->mi);
  15. }
  16. };
  17. Node* bulid(long long L,long long R){
  18. Node *node=new Node();
  19. if(L==R){
  20. node->mi=node->ma=arr[L];
  21. return node;
  22. }
  23. long long M=(L+R)>>1;
  24. node->lc=bulid(L,M);
  25. node->rc=bulid(M+1,R);
  26. node->pull();
  27. return node;
  28. }
  29. long long query_ma(Node* node,long long L,long long R,long long ql,long long qr){
  30. if(ql<=L&&R<=qr)return node->ma;
  31. long long M=(L+R>>1),ans=-MAX;
  32. if(ql<=M)ans=max(ans,query_ma(node->lc,L,M,ql,qr));
  33. if(qr>M)ans=max(ans,query_ma(node->rc,M+1,R,ql,qr));
  34. return ans;
  35. }
  36. long long query_mi(Node* node,long long L,long long R,long long ql,long long qr){
  37. if(ql<=L&&R<=qr)return node->mi;
  38. long long M=(L+R>>1),ans=MAX;
  39. if(ql<=M)ans=min(ans,query_mi(node->lc,L,M,ql,qr));
  40. if(qr>M)ans=min(ans,query_mi(node->rc,M+1,R,ql,qr));
  41. return ans;
  42. }
  43. long long query(Node* node,long long L,long long R,long long ql,long long qr){
  44. // cout<<L<<' '<<R<<' '<<ql<<' '<<qr<<'\n';
  45. if(ql<=L&&R<=qr)return node->ans;
  46. long long M=(L+R)>>1,ans=0;
  47. if(ql<=M) ans=max(ans,query(node->lc,L,M,ql,qr));
  48. if(qr>M) ans=max(ans,query(node->rc,M+1,R,ql,qr));
  49. if(ql<=M&&qr>M)ans=max(ans,query_ma(node->rc,M+1,R,M+1,qr)-query_mi(node->lc,L,M,ql,M));
  50. return ans;
  51. }
  52. int main(){
  53. cin.tie(NULL);
  54. cin>>n>>t;
  55. arr[0]=0;
  56. for(int i=1;i<=n;i++){
  57. cin>>arr[i];
  58. arr[i]+=arr[i-1];
  59. }
  60. Node* root=bulid(0,n);
  61. long long x,y;
  62. for(int i=0;i<t;i++){
  63. cin>>x>>y;
  64. cout<<query(root,0,n,x-1,y)<<'\n';
  65. }
  66. }
Add Comment
Please, Sign In to add comment