#include <bits/stdc++.h>
using namespace std;
#define MAXN 256
int min_ar[MAXN*5];
int max_ar[MAXN*5];
int data[MAXN];
void pushUp( int N )
{
min_ar[N] = min( min_ar[2 * N], min_ar[2 * N + 1] );
max_ar[N] = max( max_ar[2 * N], max_ar[2 * N + 1] );
}
void build( int N, int L, int R )
{
if ( L == R )
{
min_ar[N] = data[L];
max_ar[N] = data[L];
return;
}
int M = (L + R) >> 1;
build( 2 * N, L, M );
build( 2 * N + 1, M + 1, R );
pushUp( N );
}
int query( string type, int N, int L, int R, int l, int r )
{
int rs1, rs2;
if ( l > R || r < L )
return(-1);
if ( L >= l && R <= r )
{
if ( type == "min" )
return(min_ar[N]);
else
return(max_ar[N]);
}
int M = (L + R) >> 1;
rs1 = query( type, 2 * N, L, M, l, r );
rs2 = query( type, 2 * N + 1, M + 1, R, l, r );
if ( rs1 == -1 )
return(rs2);
if ( rs2 == -1 )
return(rs1);
if ( type == "min" )
{
if ( rs1 <= rs2 )
return(rs1);
return(rs2);
} else{
if ( rs1 <= rs2 )
return(rs2);
return(rs1);
}
}
int main()
{
srand( (unsigned) time( NULL ) );
int N = 9;
for ( int i = 0; i != N; ++i )
{
printf( "%5d ", i );
}
printf( "\n" );
for ( int i = 0; i != N; ++i )
{
data[i] = rand();
printf( "%5d ", data[i] );
}
printf( "\n" );
build( 1, 0, N-1 );
while ( true )
{
int x, y;
printf( "输入数组查询范围x y\n" );
scanf( "%d%d", &x, &y );
printf( "%d\n", query( "min", 1, 0, N-1, x, y ) );
}
return(0);
}
线段树求解区间最大最小值
猜你喜欢
转载自blog.csdn.net/bojie5744/article/details/51133522
今日推荐
周排行