Cod sursa(job #910152)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 10 martie 2013 19:01:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

using namespace std;

#define Nmax 400001

int N, M, x, a, b;
int Arb[Nmax];
int start, finish, val, pos, maxim;

ifstream f("arbint.in");
ofstream g("arbint.out");

void update ( int nod, int left, int right ) {

    if ( left == right ){

        Arb[nod] = val;
        return;
    }

    int m = ( left + right ) / 2;

    if ( pos <= m )
        update ( 2 * nod, left, m );
    else
        update ( 2 * nod + 1, m + 1, right );

    Arb[nod] = max ( Arb[ 2 * nod ], Arb[ 2 * nod + 1] );
}

void query ( int nod, int left, int right ) {

    if ( start <= left && right <= finish ){

        maxim = max ( maxim, Arb[nod] );
        return;
    }

    int m = ( left + right ) / 2;

    if ( start <= m )
        query ( 2 * nod, left, m );

    if ( m < finish )
        query ( 2 * nod + 1, m + 1, right );
}

void citire(){

    f >> N >> M;

    for ( int i = 1; i <= N; ++i ) {

        f >> x;

        pos = i;
        val = x;
        update ( 1, 1, N );
    }

    for ( int i = 1; i <= M; ++i ) {

        f >> x >> a >> b;

        if ( x == 0 ){

            maxim = -1;
            start = a;
            finish = b;
            query ( 1, 1, N );

            g << maxim << "\n";
        }
        else{
                pos = a;
                val = b;
                update ( 1, 1, N );
        }
    }
}

int main(){

    citire();

    return 0;
}