Cod sursa(job #2039874)

Utilizator GeoeyMexicanuBadita George GeoeyMexicanu Data 15 octombrie 2017 00:31:30
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("sequencequery.in");
ofstream g("sequencequery.out");

struct gogu
{
    long long stmax,drmax,smax,sum;
}arb[4*100010+55],sol;
int i,j,n,m,start,finish,pos,x,ok;
void update(int nod,int st,int dr)
{
    int mij;
    if(st==dr)
    {
        f>>arb[nod].smax;
        arb[nod].sum=arb[nod].smax;
        arb[nod].stmax=arb[nod].smax;
        arb[nod].drmax=arb[nod].smax;
    }
    else
    {
        mij=(st+dr)/2;
        update(2*nod,st,mij);
        update(2*nod+1,mij+1,dr);
        arb[nod].sum=arb[2*nod].sum+arb[2*nod+1].sum;
        arb[nod].smax=max(arb[2*nod].smax,max(arb[2*nod+1].smax,arb[2*nod].drmax+arb[2*nod+1].stmax));
        arb[nod].stmax=max(arb[2*nod].stmax,arb[2*nod+1].stmax+arb[2*nod].sum);
        arb[nod].drmax=max(arb[2*nod+1].drmax,arb[2*nod].drmax+arb[2*nod+1].sum);
    }
}
void query(int nod,int st,int dr,int start,int finish)
{
    int mij;
    if(start<=st && dr<=finish)
    {
        if(ok==0)
        {
            sol=arb[nod];
            ok=1;
        }
        else
        {
            sol.smax=max(sol.smax,max(arb[nod].smax,sol.drmax+arb[nod].stmax));
            sol.sum+=arb[nod].sum;
            sol.stmax=max(arb[nod].stmax,arb[nod].sum+sol.stmax);
            sol.drmax=max(arb[nod].drmax,arb[nod].sum+sol.drmax);
        }
    }
    else
    {
        mij=(st+dr)/2;
        if(start<=mij)
            query(2*nod,st,mij,start,finish);
        if(mij<finish)
            query(2*nod+1,mij+1,dr,start,finish);
    }
}
int main()
{
    f>>n>>m;
    update(1,1,n);
    for(i=1;i<=m;i++)
    {
        f>>start>>finish;
        ok=0;
        query(1,1,n,start,finish);
        g<<sol.smax<<"\n";
    }
}