Cod sursa(job #1437891)

Utilizator BLz0rDospra Cristian BLz0r Data 18 mai 2015 19:26:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 1 << 19
#define L(x) ( (x) << 1 )
#define R(x) ( (x) << 1 ) + 1

FILE *f = fopen ( "arbint.in", "r" );
FILE *g = fopen ( "arbint.out", "w" );

int Aint[Nmax];

void Update ( int nod, int st, int dr, int poz, int val ){
    if ( st >= poz && dr <= poz ){
        Aint[nod] = val;
        return;
    }

    int mid = ( st + dr ) >> 1;

    if ( poz <= mid )
        Update ( L(nod), st, mid, poz, val );
    else
        Update ( R(nod), mid + 1, dr, poz, val );

    Aint[nod] = max ( Aint[L(nod)], Aint[R(nod)] );
}

int Query ( int nod, int st, int dr, int a, int b ){
    if ( a <= st && dr <= b )
        return Aint[nod];

    int mid = ( st + dr ) >> 1;
    int t1 = -1, t2 = -1;

    if ( a <= mid )
        t1 = Query ( L(nod), st, mid, a, b );
    if ( b > mid )
        t2 = Query ( R(nod), mid + 1, dr, a, b );

    return max ( t1, t2 );

}

int main(){

    int N, M, x, y, t;

    fscanf ( f, "%d%d", &N, &M );

    for ( int i = 1; i <= N; ++i ){
        fscanf ( f, "%d", &x );
        Update ( 1, 1, N, i, x );
    }

    for ( ; M ; --M ){
        fscanf ( f, "%d%d%d", &t, &x, &y );
        if ( !t )
            fprintf ( g, "%d\n", Query ( 1, 1, N, x, y ) );
        else
            Update ( 1, 1, N, x, y );
    }

    return 0;
}