Cod sursa(job #531050)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 8 februarie 2011 20:43:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
using namespace std;

#define NMAX 200001
#define LOGMAX 19

int rmq[LOGMAX][NMAX];
int N;


int min(int a, int b) {
	return a > b ? b : a;
}

void buildTable() {	
	int P, i, j;
	for (i = 1; i < N; i++) {
		rmq[1][i] = min(rmq[0][i], rmq[0][i+1]);
	}

	for (P = 2, j = 2; P <= N; P<<=1, j++) {
		for (i = 1; i <= N-P; i++) {
			rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i+(P>>1)]);
		}
	}
}

int getMin(int start, int end) {
	if (start == end) return rmq[0][start];
	if (start + 1 == end) return rmq[1][start];
	int P = 1;
	int i = 1;
	while (P + start < end) {
		P <<= 1;
		i++;
	}
	if (P+start > end)
	{
		i--;
		P>>=1;
		return min(rmq[i][start], rmq[i][end - P]);
	}
	else return rmq[i][start];
}

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	int M;
	scanf("%d %d", &N, &M);
	int i;
	for (i = 1; i <= N; i++) {
		scanf("%d", &rmq[0][i]);
	}

	buildTable();
	int a,b;
	for (i = 0; i < M; i++) {
		scanf ("%d %d", &a, &b);
		printf("%d\n", getMin(a,b));
	}

	return 0;
}