Cod sursa(job #156249)

Utilizator damaDamaschin Mihai dama Data 12 martie 2008 14:00:59
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>

const int nmax = 100100;
const int log = 18;

int c[log][nmax], l[nmax];

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

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	int n, m, i, j, a, b, cnt, step, sol;

	scanf("%d %d", &n, &m);

	for(i = 1; i <= n; ++i)
	{
		scanf("%d", &c[0][i]);
	}

	l[1] = 0;
	for(i = 2; i <= nmax; ++i)
	{
		l[i] = l[i / 2] + 1;
	}

	for(step = 1, cnt = 1; cnt <= n; ++step, cnt <<= 1)
	{
	   //	printf("%d\n", step);
		for(i = 1; i <= n; ++i)
		{
			c[step][i] =  min(c[step - 1][i], c[step - 1][i + cnt]);
		 //	printf("%d ", c[step][i]);
		}
		//printf("\n");
	}

	for(i = 1; i <= m; ++i)                                               
	{
		scanf("%d %d", &a, &b);

		sol = min(c[l[b - a + 1]][a], c[l[b - a + 1]][b - (1 << l[b - a + 1]) + 1]);
		printf("%d\n", sol);
	}


	return 0;
}