Cod sursa(job #156076)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 12 martie 2008 12:37:23
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>

const long MAX = 100010;
const long LG_MAX = 20;

long A[LG_MAX][MAX];
long LG[MAX];
long n,m,i,j,k;

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

inline void rmq_build() {
	for (i=1; i<=n; ++i)
		scanf("%ld", A[0]+i);
	for (j=1,k=1; j<=n; j<<=1,++k)
		for (i=1; i<=n; ++i)
			A[k][i] = min(A[k-1][i], A[k-1][i+j]);
}

inline long rmq_query(long x, long y) {
	long dif = y-x+1;
	long lg = LG[dif];
	long p = 1<<lg;
	return min(A[lg][x], A[lg][y-p+1]);
}


int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%ld %ld", &n, &m);
	for (i=2; i<=n; ++i)
		LG[i] = LG[i>>1] + 1;
	rmq_build();
	while (m--) {
		long a,b;
		scanf("%ld %ld", &a, &b);
		long r = rmq_query(a,b);
		printf("%ld\n", r);
	}
	return 0;
}