Cod sursa(job #343376)

Utilizator digital_phreakMolache Andrei digital_phreak Data 25 august 2009 18:09:31
Problema Range minimum query Scor 90
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
/*
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;
*/

#include <stdio.h>
#include <stdlib.h>

#define MAXN 100010
#define MAXLOGN 20

long A[MAXN],M[MAXN][MAXLOGN],N,NQ,LG[MAXN];

long min(long x,long y) {return (x<y)?x:y;}

void preprocess() {
	long i,j;
	//fprintf(stderr,"Logarith:\n");
	for (i=2;i<=N;++i) {LG[i] = LG[i/2]+1;/*fprintf(stderr,"%ld %ld\n",i,LG[i]);*/}
	//fprintf(stderr,"M:\n");
	for (i=0;i<N;++i) { M[i][0] = A[i];/*fprintf(stderr,"%ld %ld %ld\n",i,0,M[i][0]);*/}
	for (j=1;(1<<j)<=N;++j) {
		for (i=0;i + (1<<j) - 1 < N;++i) {
			M[i][j] = min(M[i][j-1],M[i+(1<<(j - 1))][j-1]);
			//fprintf(stderr,"%ld %ld %ld\n",i,j,M[i][j]);
		}
	}
}
/*
inline long rmq(long x,long y) {
	long k = LG[y-x+1];
	//fprintf(stderr,"%ld %ld %ld %ld\n",x,y,y-(1<<k)+1,k);
	return min(M[x][k],M[y-(1<<k)+1][k]);
}
*/
int main() {
	//ios::sync_with_stdio(false);
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%ld%ld",&N,&NQ);
	long i;
	for (i=0;i<N;++i) scanf("%ld",&A[i]);
	preprocess();
	long x,y,k;
	//fprintf(stderr,"RMQ:\n");
	for (i=0;i<NQ;++i) {
		scanf("%ld%ld",&x,&y);
		--x;--y;
		k = LG[y-x+1];
		printf("%ld\n",(M[x][k]<M[y-(1<<k)+1][k])?M[x][k]:M[y-(1<<k)+1][k]);
	}
	fclose(stdin);
	fclose(stdout);
}