Advertisement
Guest User

Untitled

a guest
Sep 28th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <cstdio>
  2. #define MAXN 50000
  3. long long ans, best, sum[4*MAXN], x[4*MAXN], y[4*MAXN], e[4*MAXN], a[MAXN+2], b[MAXN+1];
  4. int v[MAXN+2], left, right;
  5. inline long long max2(long long a, long long b){
  6.     if(a>b){
  7.         return a;
  8.     }
  9.     return b;
  10. }
  11. void dfs(int p, int st, int dr){
  12.     if(st==dr){
  13.         sum[p]=e[p]=v[st];
  14.         if(v[st]>0){
  15.             x[p]=v[st]+b[dr+1];
  16.             y[p]=v[st]+a[st-1];
  17.         }else{
  18.             x[p]=b[dr+1];
  19.             y[p]=a[st-1];
  20.         }
  21.     }else{
  22.         int m=(st+dr)/2;
  23.         dfs(2*p, st, m);
  24.         dfs(2*p+1, m+1, dr);
  25.         sum[p]=sum[2*p]+sum[2*p+1];
  26.         e[p]=max2(x[2*p+1]+y[2*p], max2(e[2*p], e[2*p+1]));
  27.         x[p]=max2(x[2*p], sum[2*p]+x[2*p+1]);
  28.         y[p]=max2(y[2*p+1], sum[2*p+1]+y[2*p]);
  29.     }
  30. }
  31. void query(int p, int st, int dr){
  32.     if((left<=st)&&(dr<=right)){
  33.         ans=max2(ans, max2(best+x[p], e[p]));
  34.         best=max2(best+sum[p], y[p]);
  35.     }else{
  36.         int m=(st+dr)/2;
  37.         if(left<=m){
  38.             query(2*p, st, m);
  39.         }
  40.         if(m+1<=right){
  41.             query(2*p+1, m+1, dr);
  42.         }
  43.     }
  44. }
  45. int main(){
  46.     int n, m, i, x, y;
  47.     long long sc;
  48.     FILE *fin, *fout;
  49.     fin=fopen("3max.in", "r");
  50.     fout=fopen("3max.out", "w");
  51.     fscanf(fin, "%d%d", &n, &m);
  52.     for(i=1; i<=n; i++){
  53.         fscanf(fin, "%d", &v[i]);
  54.     }
  55.     a[0]=0;
  56.     sc=0;
  57.     for(i=1; i<=n; i++){
  58.         if(sc<0){
  59.             sc=0;
  60.         }
  61.         sc+=v[i];
  62.         if(a[i-1]>sc){
  63.             a[i]=a[i-1];
  64.         }else{
  65.             a[i]=sc;
  66.         }
  67.     }
  68.     b[n+1]=0;
  69.     sc=0;
  70.     for(i=n; i>=0; i--){
  71.         if(sc<0){
  72.             sc=0;
  73.         }
  74.         sc+=v[i];
  75.         if(b[i+1]>sc){
  76.             b[i]=b[i+1];
  77.         }else{
  78.             b[i]=sc;
  79.         }
  80.     }
  81.     dfs(1, 2, n-1);
  82.     for(i=1; i<=m; i++){
  83.         fscanf(fin, "%d%d", &x, &y);
  84.         if(x==1){
  85.             x=2;
  86.         }
  87.         if(y==n){
  88.             y=n-1;
  89.         }
  90.         if(x>y){
  91.             fprintf(fout, "0\n");
  92.         }else{
  93.             left=x;
  94.             right=y;
  95.             ans=0;
  96.             best=a[left-1];
  97.             query(1, 2, n-1);
  98.             fprintf(fout, "%lld\n", ans);
  99.         }
  100.     }
  101.     fclose(fin);
  102.     fclose(fout);
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement