Cod sursa(job #343389)

Utilizator digital_phreakMolache Andrei digital_phreak Data 25 august 2009 18:43:08
Problema Range minimum query Scor 90
Compilator c Status done
Runda Arhiva educationala Marime 0.72 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 100010
#define MAXLOGN 20

int M[MAXN][MAXLOGN],N,NQ,LG[MAXN];

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

int main() {

	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%ld%ld",&N,&NQ);
	
	int i,j,x,y,k,l,res;
	
	for (i=0;i<N;++i) scanf("%ld",&M[i][0]);
	
	for (i=2;i<=N;++i) {LG[i] = LG[i/2]+1;}
	
	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]);
	
	for (i=0;i<NQ;++i) {
		scanf("%ld%ld",&x,&y),--x,--y;
		k = LG[y-x+1];
		l = y-(1<<k)+1;
		res = (M[x][k]<M[l][k])?M[x][k]:M[l][k];
		printf("%ld\n",res);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}