Cod sursa(job #584409)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 25 aprilie 2011 14:13:31
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>

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

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

sequence v[263000];

sequence query(int l,int r,int s,int d,int 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()
{
    int n,m,d,i,x,y;
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    scanf("%d%d",&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("%d",&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("%d%d",&x,&y);
        printf("%d\n",query(x,y,1,d,1).best);
    }
    return 0;
}