Cod sursa(job #760392)

Utilizator matei_cChristescu Matei matei_c Data 21 iunie 2012 10:56:45
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define maxn 1001
#define maxlog 11 

int n,v[maxn] ;
int m[maxlog][maxn] ;
int t,x,y ;

int rasp(int x,int y)
{
	
	if( x == y )
		return v[x] ;
	int dif = y - x + 1 ;
	
	int log = 1 ;
	int num = 1;
	
	while( num <= dif )
	{
		++ log ;
		num *= 2 ;
	}
	
	num /= 2 ;
	-- log ;
	
	return min ( m[log][ y -  num + 1 ] , rasp(x , y - num + 1 ) ) ;

}

int main()
{
	
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&v[i]);
		m[1][i] = v[i] ;
	}
	
	int pas = 1 ;
	int lin = 2 ;
	while( 1 + pas <= n )
	{
		for(int i=1;i<=n;++i)
		{
			if( i + pas > n )
				m[lin][i] = m[lin-1][i] ;
			else
				m[lin][i] = min ( m[lin-1][i] , m[lin-1][i+pas] ) ;
		}	
		pas *= 2 ;
		++ lin ;
	}	

	++t ;
	while( -- t )
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",rasp(x,y));
	}	
	
	return 0;
	
}