Cod sursa(job #1349861)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 20 februarie 2015 15:34:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_N 100000

#define IN_FILE "arbint.in"
#define OUT_FILE "arbint.out"

int N, M;
int aint[ MAX_N << 2 ];
int ans;
void update( const int &nod, const int &st, const int &dr, const int &poz, const int &val ) {
    if( st == dr ) {
        aint[ nod ] = 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 ] = max( aint[ nod << 1 ], aint[ ( nod << 1 ) + 1 ] );
}
void query( const int &nod, const int &st, const int &dr, const int &x, const int &y ) {
    if( x <= st && y >= dr ) {
        if( aint[ nod ] > ans )
            ans = aint[ nod ];
        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 i, x, y, op;

    f = fopen( IN_FILE, "r" );
    fscanf( f, "%d%d", &N, &M );
    for( i = 0; i != N; ++i ) {
        fscanf( f, "%d", &x );
        update( 1, 1, N, i + 1, x );
    }
    g = fopen( OUT_FILE, "w" );
    for( i = 0; i != M; ++i ) {
        fscanf( f, "%d%d%d", &op, &x, &y );
        if( !op ) {
            ans = 0;
            query( 1, 1, N, x, y );
            fprintf( g, "%d\n", ans );
        } else
            update( 1, 1, N, x, y );
    }
    fclose( f );
    fclose( g );
    return 0;
}