Cod sursa(job #478435)

Utilizator mottyMatei-Dan Epure motty Data 18 august 2010 17:25:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>

const int N=100002, M=21;

int n, m, min[N][M];

inline int Minim( int a, int b)
{
	return (a<b ? a:b);
}

void Read()
{
	scanf( "%d%d", &n, &m);
	
	for( int i=1; i<=n; ++i)
		scanf( "%d", &min[i][0]);
}

void Precalculation()
{
	int PowMax=1;
	while( (1<<PowMax+1)<n )
		PowMax++;
	
	for( int i=1; i<=PowMax; ++i)
		for( int j=1; j<=(n-(1<<i)+1); ++j)
			min[j][i] = Minim( min[j][i-1], min[ j + (1<<(i-1)) ][i-1]);
}

inline int GetPow(int a)
{
	int PowMax=0;
	while( (1<<(PowMax+1))<=a )
		PowMax++;
	return PowMax;
}

void Respond()
{
	int a, b, PowMax;
	while(m--)
	{
		scanf( "%d%d", &a, &b);
		PowMax=GetPow(b-a);
		printf( "%d\n", Minim( min[a][PowMax], min[b-(1<<PowMax)+1][PowMax]));
	}
}

int main()
{
	freopen( "rmq.in", "r", stdin);
	freopen( "rmq.out", "w", stdout);
	
	Read();
	Precalculation();
	Respond();
	
	return 0;
}