Cod sursa(job #714954)

Utilizator GrimpowRadu Andrei Grimpow Data 16 martie 2012 13:10:38
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>

struct sequence
{
    long long all,left,right,best;
};

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

sequence v[263000];

sequence query(long long l,long long r,long long s,long long d,long long node)
{
    if ((s>r)||(d<l)) return v[0];
    if ((l<=s)&&(r>=d)) return v[node];
    sequence a,b,c;
    a=query(l,r,s,(s+d)/2,2*node);
    b=query(l,r,(s+d)/2+1,d,2*node+1);
    c.all=a.all+b.all;
    c.left=max(a.all+b.left,a.left);
    c.right=max(a.right+b.all,b.right);
    c.best=max(a.right+b.left,max(a.best,b.best));
    return c;
}

int main()
{
    long long n,m,d,i,x,y;
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for (d=1;d<n;d<<=1);
    v[0].all=-100000;v[0].best=-100000;v[0].left=-100000;v[0].right=-100000;
    for (i=d;i<d+n;++i)
    {
        scanf("%lld",&v[i].all);
        v[i].left=v[i].all;
        v[i].right=v[i].all;
        v[i].best=v[i].all;
    }
    for (i=d-1;i>0;--i)
    {
        v[i].all=v[2*i].all+v[2*i+1].all;
        v[i].left=max(v[2*i].all+v[2*i+1].left,v[2*i].left);
        v[i].right=max(v[2*i].right+v[2*i+1].all,v[2*i+1].right);
        v[i].best=max(v[2*i].right+v[2*i+1].left,max(v[2*i].best,v[2*i+1].best));
    }
    for (i=1;i<=m;++i)
    {
        scanf("%lld%lld",&x,&y);
        printf("%lld\n",query(x,y,1,d,1).best);
    }
    return 0;
}