Cod sursa(job #1254254)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 2 noiembrie 2014 13:43:33
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <algorithm>
#define left (nod<<1)
#define right ((nod<<1)+1)
#define LL long long
#define Nmax 100001

using namespace std;

struct arbore
{
    LL st,dr,sum,best;
};

arbore arb[3*Nmax];
LL i,n,m,x,y,S,Max;

inline void update(int nod, int st, int dr, int poz)
{
    if (st==dr)
    {
        arb[nod].st=arb[nod].dr=arb[nod].sum=arb[nod].best=x;
        return;
    }
    LL mij=(st+dr)>>1;
    if (poz<=mij) update(2*nod,st,mij,poz);
    else update(2*nod+1,mij+1,dr,poz);

    arb[nod].sum=arb[2*nod].sum+arb[2*nod+1].sum;
    arb[nod].best=max(arb[left].dr+arb[right].st,max(arb[left].best,arb[right].best));
    arb[nod].st=max(arb[left].dr, arb[left].sum+arb[right].st);
    arb[nod].dr=max(arb[right].dr, arb[right].sum+arb[left].dr);
}

inline void query(int nod, int st, int dr, int x, int y)
{
    if (x<=st && dr<=y)
    {
        Max=max(Max,max(arb[nod].best,S+arb[nod].st));
        S=max(S+arb[nod].sum,arb[nod].dr);
    }
    else
    {
        LL mij=(st+dr)>>1;
        if (x<=mij) query(left,st,mij,x,y);
        if (y>mij) query(right,mij+1,dr,x,y);
    }
}

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

    scanf("%I64d %I64d", &n, &m);
    for (i=1;i<=n;++i)
    {
        scanf("%I64d", &x);
        update(1,1,n,i);
    }

    for (i=1;i<=m;++i)
    {
        scanf("%I64d %I64d", &x, &y);
        Max=-Nmax; S=0;
        query(1,1,n,x,y);
        printf("%I64d\n", Max);
    }

    return 0;
}