Cod sursa(job #1191317)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 26 mai 2014 23:14:59
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>

using namespace std;

struct cel
{

    long long incep,termin,total,best;

}adi[400005];

long long n,m,t,x,y;

void update(int st,int dr,int i,int val,int nod)
{
    if (st==dr)
    {
        adi[nod].incep=val;
        adi[nod].termin=val;
        adi[nod].total=val;
        adi[nod].best=val;
    }else
    {
        int m=(st+dr)/2;
        if (i<=m) update(st,m,i,val,nod*2);else update(m+1,dr,i,val,nod*2+1);
        adi[nod].incep=adi[nod*2].incep; if (adi[nod*2].total+adi[nod*2+1].incep>adi[nod].incep) adi[nod].incep=adi[nod*2].total+adi[nod*2+1].incep;
        adi[nod].termin=adi[nod*2+1].termin; if (adi[nod*2+1].total+adi[nod*2].termin>adi[nod].termin) adi[nod].termin=adi[nod*2+1].total+adi[nod*2].termin;
        adi[nod].total=adi[nod*2].total+adi[nod*2+1].total;
        adi[nod].best=adi[nod*2].best; if (adi[nod*2+1].best>adi[nod].best) adi[nod].best=adi[nod*2+1].best; if (adi[nod].best<adi[nod*2].termin+adi[nod*2+1].incep) adi[nod].best=adi[nod*2].termin+adi[nod*2+1].incep;
    }
}

cel scoate(int st,int dr,int i,int j,int nod)
{
    if (st==i && dr==j)
    {
        return adi[nod];
    }
    else
    {
        int m=(st+dr)/2;
        if (i>m)
        {
            return scoate(m+1,dr,i,j,nod*2+1);
        }else
        if (j<=m)
        {
            return scoate(st,m,i,j,nod*2);
        }else
        {
            cel v,v2,res;
            v=scoate(st,m,i,m,nod*2);
            v2=scoate(m+1,dr,m+1,j,nod*2+1);

                    res.incep=v.incep; if (v.total+v2.incep>res.incep) res.incep=v.total+v2.incep;
                    res.termin=v2.termin; if (v2.total+v.termin>res.termin) res.termin=v2.total+v.termin;
                    res.total=v.total+v2.total;
                    res.best=v.best; if (v2.best>res.best) res.best=v2.best; if (res.best<v.termin+v2.incep) res.best=v.termin+v2.incep;

            return res;

        }
    }

}

int main()
{
    ifstream in ("sequencequery.in");
    ofstream out ("sequencequery.out");

    in>>n>>m;
    for (int i=1;i<=n;++i)
    {
        in>>t;
        update(1,100000,i,t,1);
    }

    for (int i=1;i<=m;++i)
    {
        in>>x>>y;
        cel v=scoate(1,100000,x,y,1);
        out<<v.best<<"\n";
    }

    in.close();
    out.close();
    return 0;
}