Cod sursa(job #500942)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 13 noiembrie 2010 19:47:22
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#include <math.h>

long n, m, i, put, j, rMq[20][100010], st, en, p, val;

inline long min(long a, long b) {
	if (a < b) 
		return a;
	return b;
}

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	
	scanf("%ld %ld", &n, &m);
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &rMq[1][i]);
	}
	
	for (i = 2, put = 2; put <= n; ++i, put <<= 1) {
		for (j = 1; j <= n; ++j) {
			long aux = 0;
			if (j + (put / 2) <= n) aux = rMq[i - 1][j + (put / 2)];
			else aux = 2000000000;
			rMq[i][j] = min(rMq[i - 1][j], aux);
		}
	}
	
	for (i = 1; i <= m; ++i) {
		scanf("%ld %ld", &st, &en);
		p = 1;
		val = 0;
		while (p * 2 <= (en - st + 1)) {p *= 2;++val;}
		printf("%ld\n", min(rMq[val + 1][st], rMq[val + 1][en - p + 1]));
	}
	return 0;
}