Cod sursa(job #448072)

Utilizator ooctavTuchila Octavian ooctav Data 2 mai 2010 16:42:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100010;
const int LMAX = 18;

int N, M;

int A[NMAX];
int R[LMAX][NMAX];
int lg[NMAX];

void log()
{
	lg[1] = 0;
	for(int i = 2 ; i <= N ; i++)
		lg[i] = lg[i/2] + 1;
}

void rmq()
{
	for(int j = 1 ; j <= N ; j++)
		R[0][j] = A[j];

	for(int i = 1 ; (1<<i) <= N ; i++)
		for(int j = 1 ; j + (1<<i) - 1 <= N ; j++)
			R[i][j] = min(R[i - 1][j], R[i - 1][j +(1<<(i - 1))]);
}

void citire()
{
	scanf("%d%d", &N, &M);
	for(int i = 1 ; i <= N ; i++)
		scanf("%d",&A[i]);
	log();
	rmq();
	for(int i = 1 ; i <= M ; i++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		int k = lg[y - x + 1];
		printf("%d\n", min(R[k][x], R[k][y - (1<<k) + 1]));
	}
}

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

	return 0;
}