Cod sursa(job #377652)

Utilizator yobunSasaujan Marian yobun Data 25 decembrie 2009 18:47:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

#define in "arbint.in"

#define out "arbint.out"

#define maxim(a,b) ((a)>(b)?(a):(b))

const int INF = (1<<30);

const int NMAX = 400005;

int A[NMAX], N, M, POS, VALUE, VAL_MAX;

void Update( int nod, int left, int right )

{

if ( left == right )

{

A[nod] = VALUE;

return;

}


int div = (left+((right-left)>>1));

if ( POS <= div ) Update ( 2*nod, left, div );

else              Update ( 2*nod+1, div+1,right );

 
A[nod] = maxim ( A[2*nod], A[2*nod+1] );

}

 

void Query( int nod, int left, int right, int START, int FINAL )

{

if ( START <= left && right <= FINAL )

{

VAL_MAX = maxim( VAL_MAX, A[nod] );

return;

}

int div = (left + ((right-left)>>1));

if ( START <= div ) Query ( 2*nod, left, div, START, FINAL );

if ( FINAL > div )  Query ( 2*nod+1, div+1, right, START, FINAL );

}
 

int main(void)

{

freopen ( in, "r", stdin );

freopen ( out, "w", stdout );

 
scanf ( "%d%d", &N, &M );


int i, OP, START, FINAL;

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

{

POS = i;

scanf ( "%d", &VALUE );   

Update( 1, 1, N );

}

for ( ; M; --M )

{

scanf ( "%d%d%d", &OP, &POS, &VALUE );

if ( OP ) Update ( 1, 1, N );

else {

START = POS, FINAL = VALUE, VAL_MAX = -INF;

Query(1,1,N,START,FINAL);

printf ( "%d\n", VAL_MAX );

}

}

return 0;

}