Cod sursa(job #1459885)

Utilizator aimrdlAndrei mrdl aimrdl Data 11 iulie 2015 04:10:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <iostream>
#include <fstream>

#define MAX 100005
#define LMAX 18
#define MIN(a, b) ((a) < (b)) ? (a) : (b)

int n, m, M[MAX][LMAX], v[MAX];
int l2 (int x) {
	int i = 0;
	while (x > 1) {
		x >>= 1;
		++i;
	}
	return i;
}

void preprocess () {
	for (int i = 1; i <= n; ++i) {
		M[i][0] = v[i];
	}
	
	for (int j = 1; (1 << j) <= n; ++j) {
		for (int i = 0; (i + (1<<j) - 1) <= n; ++i) {
			if (M[i][j-1] < M[i+(1<<(j-1))][j-1]) {
				M[i][j] = M[i][j-1];
			} else {
				M[i][j] = M[i+(1<<(j-1))][j-1];
			}
		}
	}
}

int main(void) {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &v[i]);
	}
	
	preprocess();
	
	for (int i = 0; i < m; ++i) {
		int x, y;
		scanf("%d %d", &x, &y);
		int k = l2(y - x);
		printf("%d\n", MIN(M[x][k], M[y - (1<<k) + 1][k]));
	}
	return 0;
}