第一波冲击:单点修改,区间查询最值
#include <bit/stdc++.h>
using namespace std;
const int nn= 100005 ;
int n;
struct tree
{
int l, r;
int dat;
} t[ nn* 4 ] ;
inline int read ( )
{
int x= 0 , f= 1 ; char ch= getchar ( ) ;
while ( ch> '9' || ch< '0' ) { if ( ch== '-' ) f= - 1 ; ch= getchar ( ) ; }
while ( ch>= '0' && ch<= '9' ) { x= x* 10 + ch- '0' ; ch= getchar ( ) ; }
return x* f;
}
void build ( int p, int l, int r)
{
t[ p] . l= l; t[ p] . r= r;
if ( l== r) return ;
int mid= ( l+ r) >> 1 ;
build ( p<< 1 , l, mid) ;
build ( p<< 1 | 1 , mid+ 1 , r) ;
}
void change ( int p, int x, int v)
{
if ( t[ p] . l== t[ p] . r) { t[ p] . dat= v; return ; }
int mid= ( t[ p] . l+ t[ p] . r) >> 1 ;
if ( x<= mid) change ( p<< 1 , x, v) ;
else change ( p<< 1 | 1 , x, v) ;
t[ p] . dat= max ( t[ p<< 1 ] . dat, t[ p<< 1 | 1 ] . dat) ;
}
int ask ( int p, int l, int r)
{
if ( l<= t[ p] . l&& t[ p] . r<= r) return t[ p] . dat;
int mid= ( t[ p] . l+ t[ p] . r) >> 1 ;
int val= - ( 1 << 30 ) ;
if ( l<= mid) val= max ( val, ask ( p<< 1 , l, r) ) ;
if ( r> mid) val= max ( val, ask ( p<< 1 | 1 , l, r) ) ;
return val;
}
int main ( )
{
freopen ( "a.in" , "r" , stdin ) ;
freopen ( "a.out" , "w" , stdout ) ;
n= read ( ) ;
build ( 1 , 1 , n) ;
for ( int i= 1 ; i<= n; ++ i)
{
int op= read ( ) ;
int l= read ( ) , r= read ( ) ;
if ( op== 1 ) change ( 1 , l, r) ;
else printf ( "%d\n" , ask ( 1 , l, r) ) ;
}
return 0 ;
}