Cod sursa(job #1955278)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 5 aprilie 2017 21:32:14
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <algorithm>
#define N 1<<18
#define mid ((l+r)/2)
using namespace std;

long long n,m,v[N],A[N<<1],B[N<<1],C[N<<1],Sum[N<<1],zero;

void Build(long long n,long long l,long long r){

    if (l==r) {
              A[n]=B[n]=C[n]=v[l];
              Sum[n]=v[l];
              }
    else {
          Build(2*n,l,mid);
          Build(2*n+1,mid+1,r);

          A[n] = max(A[2*n], Sum[2*n]+A[2*n+1]);
		  B[n] = max(B[2*n]+Sum[2*n+1], B[2*n+1]);
		  C[n] = max(max(C[2*n], C[2*n+1]), B[2*n]+A[2*n+1]);

		  Sum[n]=Sum[2*n]+Sum[2*n+1];
         }
}

long long a,b;
long long S,sol;

void Query(long long n,long long l,long long r){

    if (a<=l && r<=b) {
                       sol=max(sol, max(S+A[n], C[n]));
                       S=max(S+Sum[n], B[n]);
                      }
    else {
          if (a<=mid) Query(2*n,l,mid);
          if (b>mid) Query(2*n+1,mid+1,r);
         }
}

int main()
{
    long long i,op,n1,n2;
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);

    scanf("%lld%lld",&n,&m);
    for (i=1;i<=n;++i)
        scanf("%lld",&v[i]);

    Build(1,1,n);

    while (m--){
        scanf("%lld%lld",&n1,&n2);
        S=sol=-100000;
        a=n1;
        b=n2;
        Query(1,1,n);
        printf("%lld\n",sol);
        }

    return 0;
}