Cod sursa(job #1932679)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 19 martie 2017 23:28:15
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>

using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

struct arbint
{
    long long total,ls,rs,sum;
} arb[400010];
int n,m,i,j,a[100010];
long long maxim,s;

void build(int nod, int st, int dr)
{
    if (st==dr)
    {
        arb[nod].total=arb[nod].sum=a[st];
        arb[nod].rs=arb[nod].ls=a[st];
        return;
    }
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    arb[nod].sum=arb[2*nod].sum+arb[2*nod+1].sum;
    arb[nod].ls=max(arb[2*nod].ls,arb[2*nod].sum+arb[2*nod+1].ls);
    arb[nod].rs=max(arb[2*nod+1].rs,arb[2*nod+1].sum+arb[2*nod].rs);
    arb[nod].total=arb[2*nod].rs+arb[2*nod+1].ls;
    arb[nod].total=max(arb[nod].total,max(arb[2*nod].total,arb[2*nod+1].total));
    //fout << st << ' ' << dr << ' ' << arb[nod].sum << ' ' << arb[nod].total << ' ' << arb[nod].ls << ' ' << arb[nod].rs << '\n';
}

void update(int val, int poz, int nod, int st, int dr)
{
    if (st==dr)
    {
        arb[nod].total=arb[nod].sum=val;
        arb[nod].rs=arb[nod].ls=poz;
        return;
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
        update(val,poz,2*nod,st,mij);
    else
        update(val,poz,2*nod+1,mij+1,dr);
    arb[nod].sum=arb[2*nod].sum+arb[2*nod+1].sum;
    arb[nod].ls=max(arb[2*nod].ls,arb[2*nod].sum+arb[2*nod+1].ls);
    arb[nod].rs=max(arb[2*nod+1].rs,arb[2*nod+1].sum+arb[2*nod].rs);
    arb[nod].total=arb[2*nod].rs+arb[2*nod+1].ls;
    arb[nod].total=max(arb[nod].total,max(arb[2*nod].total,arb[2*nod+1].total));
}

void interogare(int poz1, int poz2, int nod, int st, int dr)
{
    if (poz1<=st&&dr<=poz2)
    {
        if (s<0)
            s=0;
        maxim=max(maxim,max(arb[nod].total,s+arb[nod].ls));
        s=max(s+arb[nod].sum,arb[nod].rs);
        return;
    }
    int mij=(st+dr)/2;
    if (poz1<=mij)
        interogare(poz1,poz2,2*nod,st,mij);
    if (poz2>mij)
        interogare(poz1,poz2,2*nod+1,mij+1,dr);
}

int main()
{
    fin >> n >> m;
    for (i=1; i<=n; i++)
        fin >> a[i];
    build(1,1,n);
    for (i=1; i<=m; i++)
    {
        int X,Y;
        fin >> X >> Y;
        maxim=-1000000000100;
        s=0;
        interogare(X,Y,1,1,n);
        fout << maxim << '\n';
    }
}