Cod sursa(job #1372318)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 4 martie 2015 12:50:53
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define IN_FILE "sequencequery.in"
#define OUT_FILE "sequencequery.out"
#define MAX_NODE 400005

struct aint {
    long long s, b, st, dr;
} aint[ MAX_NODE ];
long long best, s;
void update( int nod, int st, int dr, int poz, int val ) {
    if( st == dr ) {
        aint[ nod ].s = aint[ nod ].b = aint[ nod ].st = aint[ nod ].dr = val;
        return;
    }
    int mid = st + ( ( dr - st ) >> 1 );
    if( poz <= mid )
        update( nod << 1, st, mid, poz, val );
    else
        update( ( nod << 1 ) + 1, mid + 1, dr, poz, val );
    aint[ nod ].s = aint[ ( nod << 1 ) ].s + aint[ ( nod << 1 ) + 1 ].s;
    aint[ nod ].b = max( aint[ ( nod << 1 ) ].dr + aint[ ( nod << 1 ) + 1 ].st, max( aint[ ( nod << 1 ) ].b, aint[ ( nod << 1 ) + 1 ].b ) );
    aint[ nod ].st = max( aint[ ( nod << 1 ) ].st, aint[ ( nod << 1 ) ].s + aint[ ( nod << 1 ) + 1 ].st );
    aint[ nod ].dr = max( aint[ ( nod << 1 ) + 1 ].dr, aint[ ( nod << 1 ) + 1 ].s + aint[ ( nod << 1 ) ].dr );
}
void query( int nod, int st, int dr, int x, int y ) {
    if( x <= st && y >= dr ) {
        best = max( best, max( aint[ nod ].b, s + aint[ nod ].st ) );
        s = max( s + aint[ nod ].s, aint[ nod ].dr );
        return;
    }
    int mid = st + ( ( dr - st ) >> 1 );
    if( x <= mid )
        query( nod << 1, st, mid, x, y );
    if( y > mid )
        query( ( nod << 1 ) + 1, mid + 1, dr, x, y );
}
int main( ) {
    FILE *f, *g;
    int N, Q, i, x, y;

    f = fopen( IN_FILE, "r" );
    fscanf( f, "%d%d", &N, &Q );
    for( i = 1; i <= N; ++i ) {
        fscanf( f, "%d", &x );
        update( 1, 1, N, i, x );
    }
    g = fopen( OUT_FILE, "w" );
    while( Q-- ) {
        fscanf( f, "%d%d", &x, &y );
        best = -( 1LL << 60 );
        s = 0;
        query( 1, 1, N, x, y );
        fprintf( g, "%lld\n", best );
    }
    fclose( f );
    fclose( g );
    return 0;
}