Cod sursa(job #1027985)

Utilizator thewildnathNathan Wildenberg thewildnath Data 13 noiembrie 2013 13:03:22
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>

long long v[400002],a[400002],b[400002],c[400002],sum[400002];
int n,m,st,dr;
long long s,sol;

inline long long max(long long a,long long b)
{return a>b?a:b;}

void init(int l,int r,int x)
{
    if(l==r)
    {
        a[x]=b[x]=c[x]=sum[x]=v[l];
        return;
    }
    int med=(l+r)/2;
    init(l,med,2*x);
    init(med+1,r,2*x+1);

    a[x]=max(a[2*x],sum[2*x]+a[2*x+1]);
    b[x]=max(b[2*x]+sum[2*x+1],b[2*x+1]);
    c[x]=max(max(c[2*x],c[2*x+1]),b[2*x]+a[2*x+1]);
    sum[x]=sum[2*x]+sum[2*x+1];
}


void query(int l,int r,int x)
{
    if(st<=l && dr>=r)
    {
        if(s<0)
            s=0;
        sol=max(sol,max(s+a[x],c[x]));
        s=max(s+sum[x],b[x]);
        return;
    }
    int med=(l+r)/2;
    if(st<=med)
        query(l,med,2*x);
    if(dr>med)
        query(med+1,r,2*x+1);
}


int main()
{
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%lld",&v[i]);

    init(1,n,1);

    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&st,&dr);
        s=sol=-2000000000;

        query(1,n,1);

        printf("%lld\n",sol);
    }

    return 0;
}