Cod sursa(job #387120)

Utilizator bixcabc abc bixc Data 26 ianuarie 2010 20:54:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 100010

int i, n, T;
int a[20][Nmax], lg[Nmax];

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

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

int main () {

	freopen ("rmq.in", "r", stdin);
	freopen ("rmq.out", "w", stdout);

	scanf ("%d %d", &n, &T);
	for (i = 1; i <= n; i++)
		scanf ("%d", &a[0][i]);
	
	rmq ();
	
	int st, dr;
	for (; T; T--) {
		scanf ("%d %d", &st, &dr);
		printf ("%d\n", query (st, dr));
	}
	
	return 0;
}