Cod sursa(job #154205)

Utilizator peanutzAndrei Homorodean peanutz Data 10 martie 2008 23:33:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
#include <string.h>

#define LOG 19
#define NMAX 100100

long a[LOG][NMAX];
long log[NMAX];
long n, m;

void read()
{
	long i;
	scanf("%ld %ld", &n, &m);
	for(i = 1; i <= n; ++i)
		scanf("%ld", &a[0][i]);
	for(i = 2; i <= n; ++i) log[i] = log[i>>1] + 1;
}

inline long MIN(long a, long b) { return (a < b) ? (a) : (b); }

void pre()
{
	long i, j;
	for(i = 1; (1 << i) <= n; ++i)
		for(j = 1; j <= n - (1 << i)+1; ++j)
			a[i][j] = MIN(a[i-1][j], a[i-1][j + (1 << (i-1))]);
}

inline long query(long x, long y)
{
	long len = y-x+1, pow = log[len];

	return MIN(a[pow][x], a[pow][y-(1<<pow)+1]);
}


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

	read();

	pre();

	while(m--)
	{
		scanf("%ld %ld", &x, &y);
		printf("%ld\n", query(x, y));
	}


	return 0;
}