菜鸟生成记(67)
线段树求区间最大值
不过这个判题机有点儿坑,scanf,printf都过不了,必须"开挂"才行
AC代码(输入输出加速挂)
#include< stdio. h>
#define N 100100
#define max ( x, y) x> y? x: y
#define inf ( ( 1 << 32 ) - 1 )
int arr[ N ] ;
int tree[ 4 * N ] ;
int n, m;
void bulid_t ( int rt , int start , int end)
{
if ( start == end)
{
tree[ rt] = arr[ start] ;
}
else
{
int mid = ( start+ end) >> 1 ;
int left_son = ( rt<< 1 ) + 1 ;
int right_son = ( rt<< 1 ) + 2 ;
bulid_t ( left_son , start , mid) ;
bulid_t ( right_son , mid+ 1 , end) ;
tree[ rt] = max ( tree[ left_son] , tree[ right_son] ) ;
}
}
int query_t ( int rt , int start , int end , int L , int R )
{
if ( end < L || start > R )
{
return - inf;
}
else if ( start >= L && end <= R )
{
return tree[ rt] ;
}
else if ( start == end)
{
return tree[ rt] ;
}
else
{
int mid = ( start + end) >> 1 ;
int left_son = ( rt<< 1 ) + 1 ;
int right_son = ( rt<< 1 ) + 2 ;
int left_val = query_t ( left_son , start , mid , L , R ) ;
int right_val= query_t ( right_son, mid+ 1 , end , L , R ) ;
return max ( left_val , right_val) ;
}
}
int read ( )
{
char ch= ' ' ;
int ans= 0 ;
while ( ch< '0' || ch> '9' )
ch= getchar ( ) ;
while ( ch<= '9' && ch>= '0' )
{
ans= ans* 10 + ch- '0' ;
ch= getchar ( ) ;
}
return ans;
}
void out ( int a)
{
if ( a > 9 )
{
out ( a/ 10 ) ;
}
putchar ( a% 10 + '0' ) ;
}
int main ( )
{
n= read ( ) ;
m= read ( ) ;
for ( int i= 0 ; i< n; ++ i)
arr[ i] = read ( ) ;
bulid_t ( 0 , 0 , n- 1 ) ;
for ( int i= 0 ; i< m; ++ i)
{
int a, b, ans;
a= read ( ) ;
b= read ( ) ;
ans= query_t ( 0 , 0 , n- 1 , a- 1 , b- 1 ) ;
out ( ans) ;
putchar ( '\n' ) ;
}
return 0 ;
}