Cod sursa(job #379248)

Utilizator DraStiKDragos Oprica DraStiK Data 31 decembrie 2009 11:33:56
Problema SequenceQuery Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <algorithm>
using namespace std;

#define ll long long
#define INF 1LL<<62
#define DIM 100005

ll sum[DIM],Min[3*DIM],Max[3*DIM],best[3*DIM];
int a[DIM];
int n,m;

void read ()
{
    int i;

    scanf ("%d%d",&n,&m);
    for (i=1; i<=n; ++i)
    {
        scanf ("%d",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
}

void build (int nod,int st,int dr)
{
    int mij;

    if (st==dr)
    {
        best[nod]=a[st];
        Max[nod]=sum[st];
        Min[nod]=sum[st-1];
    }
    else
    {
        mij=(st+dr)/2;
        build (2*nod,st,mij);
        build (2*nod+1,mij+1,dr);
        Max[nod]=max (Max[2*nod],Max[2*nod+1]);
        Min[nod]=min (Min[2*nod],Min[2*nod+1]);
        best[nod]=max (max (best[2*nod],best[2*nod+1]),Max[2*nod+1]-Min[2*nod]);
    }
}

ll qmax (int nod,int st,int dr,int in,int sf)
{
    ll nrt=-INF;
    int mij;

    if (in<=st && dr<=sf)
        return Max[nod];
    mij=(st+dr)/2;
    if (in<=mij)
        nrt=max (nrt,qmax (2*nod,st,mij,in,sf));
    if (mij<sf)
        nrt=max (nrt,qmax (2*nod+1,mij+1,dr,in,sf));
    return nrt;
}

ll qmin (int nod,int st,int dr,int in,int sf)
{
    ll nrt=INF;
    int mij;

    if (in<=st && dr<=sf)
        return Min[nod];
    mij=(st+dr)/2;
    if (in<=mij)
        nrt=min (nrt,qmin (2*nod,st,mij,in,sf));
    if (mij<sf)
        nrt=min (nrt,qmin (2*nod+1,mij+1,dr,in,sf));
    return nrt;
}

ll query (int nod,int st,int dr,int in,int sf)
{
    ll nrt=-INF;
    int mij;

    if (in<=st && dr<=sf)
        return best[nod];
    mij=(st+dr)/2;
    if (in<=mij)
        nrt=max (nrt,query (2*nod,st,mij,in,sf));
    if (mij<sf)
        nrt=max (nrt,query (2*nod+1,mij+1,dr,in,sf));
    if (in<=mij && mij<sf)
        nrt=max (nrt,qmax (2*nod+1,mij+1,dr,in,sf)-qmin (2*nod,st,mij,in,sf));
    return nrt;
}

void solve ()
{
    int i,x,y;

    for (i=1; i<=m; ++i)
    {
        scanf ("%d%d",&x,&y);
        printf ("%lld\n",query (1,1,n,x,y));
    }
}

int main ()
{
    freopen ("sequencequery.in","r",stdin);
    freopen ("sequencequery.out","w",stdout);

    read ();
    build (1,1,n);
    solve ();

    return 0;
}