Cod sursa(job #578349)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 11 aprilie 2011 11:12:40
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <algorithm>
#include <fstream>

using namespace std;

const int Dim = 100001;
const int Inf = 0x3f3f3f3f;

int N, M;
int ans, aux, aint_sm[Dim << 2], aint_sum[Dim << 2], aint_smst[Dim << 2], aint_smdr[Dim << 2];

void Upd( int nod, int st, int dr, int p, int a ) {

    int fs, fd, mj;

    if( st == dr ) {

        aint_sm[nod] = a;
        aint_sum[nod] = a;
        aint_smst[nod] = a;
        aint_smdr[nod] = a;

        return;
    }

    fs = nod << 1;
    fd = fs | 1;
    mj = (st + dr) >> 1;

    if( p <= mj )
        Upd( fs, st, mj, p, a );
    else
        Upd( fd, mj + 1, dr, p, a );

    aint_sm[nod] = max( aint_smdr[fs] + aint_smst[fd], max( aint_sm[fs], aint_sm[fd] ) );
    aint_sum[nod] = aint_sum[fs] + aint_sum[fd];
    aint_smst[nod] = max( aint_smst[fs], aint_sum[fs] + aint_smst[fd] );
    aint_smdr[nod] = max( aint_smdr[fd], aint_sum[fd] + aint_smdr[fs] );
}

void Que( int nod, int st, int dr, int x, int y ) {

    int fs, fd, mj;

    if( x <= st && dr <= y ) {

        if( aux < 0 )
            aux = 0;
        ans = max( ans, max( aux + aint_smst[nod], aint_sm[nod] ) );
        aux = max( aux + aint_sum[nod], aint_smdr[nod] );

        return;
    }

    fs = nod << 1;
    fd = fs | 1;
    mj = (st + dr) >> 1;

    if( x <= mj )
        Que( fs, st, mj, x, y );
    if( y > mj )
        Que( fd, mj + 1, dr, x, y );
}

int main() {

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

    int i, x, y;

    fin >> N;
    fin >> M;
    for( i = 1; i <= N; ++i ) {

        fin >> x;
        Upd( 1, 1, N, i, x );
    }

    while( M-- ) {

        fin >> x;
        fin >> y;

        ans = -Inf;
        aux = 0;
        Que( 1, 1, N, x, y );

        fout << ans << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}