Cod sursa(job #206440)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 septembrie 2008 18:37:53
Problema SequenceQuery Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
# include <cstdio>

using namespace std;

# define FIN "sequencequery.in"
# define FOUT "sequencequery.out"
# define max(a,b) (a > b ? a : b)
# define MAXN 100005

int N,M,i,j,a,b;
long long rez,sum;
int V[MAXN];
long long S[MAXN];
long long A[MAXN<<2];
long long B[MAXN<<2];
long long C[MAXN<<2];

     void update(int nod,int st,int dr)
     {
         int mij;
         
         if (st == dr)
           A[nod] = B[nod] = C[nod] = V[st];
         else
           {
               mij = (st + dr) >> 1;
               update(nod<<1,st,mij);
               update(nod<<1|1,mij+1,dr);
               A[nod] = max(A[nod<<1+1],A[nod<<1]);
               B[nod] = max(B[nod<<1],B[nod<<1|1]+S[mij]-S[st-1]);
               C[nod] = max(C[nod<<1|1],C[nod<<1]+S[dr]-S[mij]);
               A[nod] = max(A[nod],B[nod<<1|1]+C[nod<<1]);
           }
     }
     
     void query(int nod,int st,int dr,int a,int b)
     {
         int mij;
         
         if (a <= st && dr <= b)
           {
               rez = max(rez,A[nod]);
               rez = max(rez,sum + B[nod]);
               sum = max(C[nod],sum + S[dr] - S[st-1]);
           }
         else
           {
               mij = (st + dr) >> 1;
               if (a <= mij)
                 query(nod<<1,st,mij,a,b);
               if (b > mij)
                 query(nod<<1|1,mij+1,dr,a,b);
           }
     }

     int main()
     {
         freopen(FIN,"r",stdin);
         freopen(FOUT,"w",stdout);
         
         scanf("%d%d",&N,&M);
         for (i = 1; i <= N; ++i)
           {
              scanf("%d",&V[i]);
              S[i] = S[i-1] + V[i];
           }
         
         update(1,1,N);
           
         for (i = 1; i <= M; ++i)
           {
              sum = 0;
              rez = -100000;
              scanf("%d%d",&a,&b);
              query(1,1,N,a,b);
              printf("%lld\n",rez);
           }
            
         return 0;
     }