Cod sursa(job #211520)

Utilizator vlad_popaVlad Popa vlad_popa Data 2 octombrie 2008 18:30:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAXN 100005
#define MAXL 18

int N, M;
int d[MAXL][MAXN];
int lg[MAXN];

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

	int i, j;
	scanf ("%d %d\n", &N, &M);
	for (i = 1; i <= N; ++ i){
		i != 1 ? lg[i] = lg[(i>>1)] + 1 : lg[i] = 0;
		scanf("%d\n", &d[0][i]);
	}	

	for (i = 1; i <= lg[N]; ++ i)
		for (j = 1; j <= N - (1<<i) + 1; ++ j)
			d[i][j] = min (d[i-1][j], d[i-1][j + (1<<(i-1))]);

    /*for (i = 0; i <= lg[N]; ++ i, printf ("\n"))
		for (j = 1; j <= N; printf ("%d ", d[i][j]), ++ j)*/;

    int a, b, lg_ab;
	for (i = 1; i <= M; ++ i){
		scanf ("%d %d\n", &a, &b);
		lg_ab = lg[b - a];
		printf ("%d\n", min (d[lg_ab][a], d[lg_ab][b - (1<<lg_ab) + 1]));
	}

	return 0;
}