Cod sursa(job #831448)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 8 decembrie 2012 17:23:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb

#include <cstdio>

const int MAX_SIZE(100000);

int n, m;

int rmq [17] [MAX_SIZE];
int log [MAX_SIZE];

inline int min (int a, int b)
{
	if (a < b)
		return a;
	return b;
}

inline void build (void)
{
	for (int index(2) ; index <= n ; ++index)
		log[index] = log[index >> 1] + 1;
	int i, j;
	for (i = 1 ; i <= log[n] ; ++i)
		for (j = 1 ; j <= n ; ++j)
			rmq[i][j] = min(rmq[i - 1][j],rmq[i - 1][j + (1 << (i - 1))]);
}

inline int query (int left, int right)
{
	int cardinal(right - left + 1);
	return min(rmq[log[cardinal]][left],rmq[log[cardinal]][right - (1 << log[cardinal]) + 1]);
}

int main (void)
{
	std::freopen("rmq.in","r",stdin);
	std::freopen("rmq.out","w",stdout);
	std::scanf("%d %d",&n,&m);
	for (int index(1) ; index <= n ; ++index)
		std::scanf("%d",&rmq[0][index]);
	build();
	for (int counter(0), left, right ; counter < m ; ++counter)
	{
		std::scanf("%d %d",&left,&right);
		std::printf("%d\n",query(left,right));
	}
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}