Cod sursa(job #1744366)

Utilizator Athena99Anghel Anca Athena99 Data 19 august 2016 17:40:45
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>

using namespace std;

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

typedef long long i64;

const int inf= 1<<30;
const int nmax= 100000;
const int pmax= 262144;

struct str {
    i64 b, e, a, s;
};

i64 sol, aux;
int v[nmax+1];
str arb[pmax+1];

void make_arb( int x, int l, int r ) {
    if ( l==r ) {
        arb[x].b= arb[x].e= arb[x].a= arb[x].s= v[r];
    } else {
        make_arb(x*2, l, (l+r)/2);
        make_arb(x*2+1, (l+r)/2+1, r);

        arb[x].b= max(arb[x*2].b, arb[x*2].s+arb[x*2+1].b);
        arb[x].e= max(arb[x*2+1].e, arb[x*2+1].s+arb[x*2].e);
        arb[x].a= max(arb[x*2+1].b+arb[x*2].e, max(arb[x*2].a, arb[x*2+1].a));
        arb[x].s= arb[x*2].s+arb[x*2+1].s;
    }
}

void query( int x, int l, int r, int a, int b) {
    if ( a<=l && r<=b ) {
        sol= max(max(arb[x].a, arb[x].b+aux), sol);
        aux= max(arb[x].e, aux+arb[x].s);
    } else if ( max(a, l)<=min(b, r) ) {
        query(x*2, l, (l+r)/2, a, b);
        query(x*2+1, (l+r)/2+1, r, a, b);
    }
}

int main(  ) {
    int n, m;
    fin>>n>>m;
    for ( int i= 1; i<=n; ++i ) {
        fin>>v[i];
    }
    make_arb(1, 1, n);

    for ( int cnt= 1; cnt<=m; ++cnt ) {
        int a, b;
        fin>>a>>b;

        sol= aux= -inf;
        query(1, 1, n, a, b);
        fout<<sol<<"\n";
    }

    return 0;
}