Cod sursa(job #1484841)

Utilizator Ionut.popescuLiviu Rebreanu Ionut.popescu Data 12 septembrie 2015 00:19:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
 
#define NX (1<<17)
#define INF (0x3f3f3f3f)
 
int T[ NX ], a[ NX ];
int N, M;
 
int que( int l, int r ) {
 int p, q, m = 0;
 
 for( p=r-(r&-r); l<=r; r=p, p-=p&-p ) {
 q = ( p+1 >= l ) ? T[r] : (p=r-1) + 1;
 if( a[m] < a[q] )
 m = q;
 }
 
 return m;
}
 
void upd( int x ) {
 int y, z;
 for( y = x; x <= N; x += x & -x )
 if( T[x] == y ) {
 z = que( x-(x&-x) + 1, x-1 );
 T[x] = (a[z] > a[x]) ? z : x;
 }
 else
 if( a[ T[x] ] < a[ y ] )
 T[x] = y;
}
 
int main() {
 int i, x, y, op;
 
 freopen( "arbint.in", "r", stdin );
 freopen( "arbint.out", "w", stdout );
 
 a[0] = -INF;
 scanf( "%d%d", &N, &M );
 
 for( i = 1; i <= N; i++ ) {
 scanf( "%d", a+i );
 upd( i );
 }
 
 while( M-- ) {
 scanf( "%d%d%d", &op, &x, &y );
 if( op == 0 )
 printf( "%d\n", a[ que( x, y ) ] );
 else
 a[x] = y, upd( x );
 }
 
 return 0;
}