Cod sursa(job #550453)

Utilizator skullLepadat Mihai-Alexandru skull Data 9 martie 2011 16:25:47
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define nmax 100002
#define lmax 18

int rmq[lmax][lmax];
int N, M;
int lg[nmax];
int A[nmax];

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	int i, j, l;
	scanf("%d %d", &N, &M);
	for (i = 1;i <= N; ++i) scanf("%d ",&A[i]);
	lg[1]=0;
	for (i = 2; i <= N; ++i)
		lg[i] = lg[i/2]+1;
	for (i = 1; i <= N; ++i)
		rmq[0][i] = A[i];
	for (i = 1; (1 << i) <= N; ++i)
		for (j = 1;j <= N - (1 << i) + 1; ++j)
		{
			l = 1 << (i-1);
			rmq[i][j] = min( rmq[i-1][j] , rmq[i-1][j+l] );
		}
	int x , y, dif, sh;
	for (i = 1; i <= M; ++i)
	{
		scanf("%d %d", &x, &y);
		dif = y - x + 1;
		l = lg[dif];
		sh = dif - (1<<l);
		printf("%ld\n", min(rmq[l][x],rmq[l][x+sh]) );
	}	
	return 0;
}