Cod sursa(job #1258278)

Utilizator felixiPuscasu Felix felixi Data 8 noiembrie 2014 17:44:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int N,M;
int arb[4*NMAX+1], Ans_Q;

void Update( int nod, int st, int dr, int poz, int val ) {
    if( st == dr ) {   ///  Am ajuns intr-o frunza
        arb[nod]= val;
    }
    else {  ///  Vad unde ma duc
        int mid= (st+dr)/2;
        if( poz <= mid ) {
            Update( 2*nod, st, mid, poz, val );
        }
        else {
            Update( 2*nod+1, mid+1, dr, poz, val );
        }
        arb[ nod ]= max( arb[ 2*nod ], arb[ 2*nod+1 ] );
    }
}

void Querry( int nod, int st, int dr, int x, int y ) {
    int mid= (st+dr)/2;
    if( st >= x && y >= dr ) {
        Ans_Q= max( Ans_Q, arb[nod] );
        return;
    }

    mid= (st+dr)/2;
    if( x<=mid ) {
        Querry( 2*nod, st, mid, x, y );
    }
    if( y>mid ) {
        Querry( 2*nod+1, mid+1, dr, x, y );
    }
}

int main() {
    in >> N >> M;
    for( int i= 1;  i<=N;  ++i ) {
        int a;
        in >> a;
        Update( 1, 1,N, i, a );
    }
    for( int i= 1;  i<=M;  ++i ) {
        int t,x,y;
        in >> t >> x >> y;
        if( t == 0 ) {
            Ans_Q= 0;
            Querry( 1, 1,N, x,y );
            out << Ans_Q << '\n';
        }
        else {
            Update( 1, 1,N, x, y );
        }
    }
    return 0;
}