Cod sursa(job #696874)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 28 februarie 2012 20:39:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<cstdio>
#include<vector>

#define INfile "rmq.in"
#define OUTfile "rmq.out" 
#define NMAX 100002

using namespace std ;

int N , M ;
int V[NMAX][18] ;
vector < int > A ( NMAX ) ;

void read () ;
void make_table () ;
void solve () ;
int main () 
{
	freopen ( INfile , "r" , stdin ) ;
	freopen ( OUTfile , "w" , stdout ) ;
	
	read () ;
	
	make_table () ;
	
	solve () ;
	
	return 0 ;
}

void read () 
{
	int i , x ;
	scanf ( "%d%d" , & N , & M ) ;
	for ( i = 1 ; i <= N ; ++ i )
	{
		scanf ( "%d" , & x ) ;
		V [ i ][ 0 ]= x  ;
	}
		
}

void make_table ()
{
	int i , j , t ;
	t = 2 ;
	A [ 1 ] = 0 ;
	for ( i = 2 ; i <= N ; ++ i ) 
		A [ i ] = A [ i / 2 ] + 1 ;
	/*
		if ( i == t ) 
		{
			A [ i ] = t ;
			t <<= 1 ;
		}			
		else
			A [ i ] = A [ i - 1 ] ;
	*/
	
	for ( j = 1 ; ( 1 << j ) <= N  ; ++ j )
		for ( i = 1 ; i + ( 1 << j ) - 1 <= N ; ++ i ) 
		{
			t = 1 << ( j - 1 ) ;
			V [ i ][ j ]=  ( V [ i ][ j - 1 ] > V [ i + t ][ j - 1 ] ?  V [ i + t ][ j -1  ] : V [ i ][ j - 1 ] ) ;
		}
	/*
	for ( i = 1 ; i <= N ; printf( "\n" ) , ++ i )
		for ( j = 0 ; j < (int) V [ i ].
		() ;  ++ j ) 
			printf ( "%d " , V [ i ][ j ] ) ;
	*/
}

void solve () 
{
	int i , x , y , diff ;
	for ( i = 1 ; i <= M ; ++ i )
	{
		scanf ( "%d%d" , & x , & y ) ;
		diff = y - x + 1 ; 
		y = V [ y - ( 1 << A [ diff ] ) + 1 ][ A [ diff ] ] ;
		x = V [ x ][ A [ diff] ] ;
		printf ( "%d\n" , ( x > y ? y : x ) ) ;
	}
}