Cod sursa(job #401571)

Utilizator bixcabc abc bixc Data 22 februarie 2010 22:29:21
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 100010

int n, T, A, B;
int a[18][Nmax], lg[Nmax];

void rmq () {
	
	lg[1] = 0; int l, i;
	for (i = 2; i <= n + 1; i++) 
		lg[i] = lg[i >> 1] + 1;
	
	for (l = 1; l <= lg[n]; l++) 
		for (i = 1; i + (1 << l) - 1 <= n; i++) 
			a[l][i] = min (a[l-1][i], a[l-1][ i + (1 << (l- 1))]);
}

int query (int A, int B) {
	
	int dif = lg[B - A + 1];
	return min (a[dif][A], a[dif][B - (1 << dif) + 1]);
}

int main () {

	freopen ("rmq.in", "r", stdin);
	freopen ("rmq.out", "w", stdout);
	
	scanf ("%d %d", &n, &T);
	for (int i = 1; i <= n; i++)
		scanf ("%d", &a[0][i]);
	
	rmq ();
	
	for (; T; T--) {
		scanf ("%d %d", &A, &B);
		printf ("%d\n", query (A, B));
	}
	
	return 0;
}