Cod sursa(job #593650)

Utilizator Catah15Catalin Haidau Catah15 Data 3 iunie 2011 22:34:49
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <iostream>

using namespace std;

#define maxN 100010
#define maxD 18


int A[maxN], RMQ[maxD][maxN], lg[maxN];


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