Cod sursa(job #1667563)

Utilizator binicBinica Nicolae binic Data 29 martie 2016 00:33:14
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int prec,n,m,t,x,y,ok;
struct  aint
{
    int sum,dr,st,secv;
}ras,a[800004];
void refresh( aint &ras, aint x, aint y)
{
    //nodul lui x< nodul lui y
    ras.sum = x.sum + y.sum;
    ras.dr = max (y.dr, x.dr + y.sum);
    ras.st = max (x.st, x.sum + y.st);
    ras.secv = max (x.dr + y.st, max (x.secv, y.secv));
}
void update (int nod, int st, int dr, int poz, int val)
{
    if (st == dr)
    {
        a[nod]= (aint) {val,val,val,val};
        return ;
    }

    int mij = (st + dr) >> 1;

    if (poz <= mij) update (nod*2, st, mij, poz, val);
    else update (nod*2+1, mij+1, dr, poz, val);

    refresh (a[nod], a[nod*2], a[nod*2+1]);
}
void query (int nod, int st, int dr, int x, int y)
{
    if (x <= st && dr <= y)
    {
        if(ok == -1)
        {
            ras = a[nod];
            ok=0;
        }
        else
            refresh(ras, ras, a[nod]);
        return ;
    }
    int mij = (st + dr) >> 1;

    if (x <= mij)   query (nod*2, st, mij, x, y);
    if (y >= mij+1) query (nod*2+1, mij+1, dr, x, y);
}

int main()
{
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    scanf ("%d",&n);
    scanf ("%d",&m);
    for (int i=1; i<=n; i++)
    {
        scanf ("%d",&x);
        update (1,1,n,i,x);
    }
    for (int i=1; i<=m; i++)
    {
        scanf ("%d %d",&x,&y);
        ok=-1;
        query (1, 1, n, x, y);
        printf ("%d\n",ras.secv);
    }
    return 0;
}