Cod sursa(job #2527314)

Utilizator mihaela.macarie01@yahoo.comMihaela Macarie [email protected] Data 20 ianuarie 2020 00:14:47
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream x("sequencequery.in");
ofstream y("sequencequery.out");

int n,m,i,j,nr,poz,val,start,finish,sol,pos,w[100002],sum,a,b;

struct elem
{
    int pi,ps,lg,a;
}v[400022];

void update(int nod, int left, int right)
{
    if(left==right)
    {
        v[nod].pi=v[nod].ps=v[nod].a=v[nod].lg=w[right];
        return;
    }

    int mij=(left+right)/2;

    update(nod*2,left,mij);
    update(nod*2+1,mij+1,right);

    v[nod].pi=max(v[nod*2].pi,v[nod*2].lg+v[nod*2+1].pi);
    v[nod].ps=max(v[nod*2+1].ps,v[nod*2+1].lg+v[nod*2].ps);
    v[nod].lg=v[nod*2].lg+v[nod*2+1].lg;
    v[nod].a=max(v[nod*2].a,max(v[nod*2+1].a,v[nod*2+1].pi+v[nod*2].ps));

}

void query(int nod, int left, int right)
{
    if(left>=start && right<=finish)
    {
        if(sum<0)
            sum=0;
        sol=max(sol,max(sum+v[nod].pi,v[nod].a));
        sum=max(sum+v[nod].lg,v[nod].ps);
        return;
    }

    int mij=(left+right)/2;

    if(start<=mij)
        query(nod*2,left,mij);
    if(finish>mij)
        query(nod*2+1,mij+1,right);
}

int main()
{
    x>>n>>m;
    for(i=1;i<=n;i++)
        x>>w[i];
    update(1,1,n);
    for(i=1;i<=m;i++)
    {
        x>>a>>b;
        sum=sol=-110000 ;
        start=a;
        finish=b;
        query(1,1,n);
        y<<sol<<'\n';
    }
    x.close();
    y.close();
    return 0;
}