Cod sursa(job #268987)

Utilizator BaduBadu Badu Badu Data 2 martie 2009 09:44:53
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<stdio.h>
#define MAX 100002
#define logMAX 18
int n,m,S[MAX][logMAX],lg[MAX];

int main(){

	freopen("rmq.in","rt",stdin);
	freopen("rmq.out","wt",stdout);

	scanf("%d%d",&n,&m);

	int i,j,x,y,k,r;

	for(i=1;i<=n;i++) scanf("%d",&S[i][0]);

	for(j = 1 ; (1<<j) - 1 < n; j++){

		for(i=1;i<=n;i++){

			S[i][j] = S[i][j-1];

                        if(i+(1<<(j-1))<=n)

			if(S[i + (1<<(j-1))][j-1] < S[i][j-1]) S[i][j] = S[i + (1<<(j-1))][j-1];

		}

	}
        lg[1]=0;
	for(i=1;i<=100000;i++) lg[i] = lg[i/2]+1;

	for(i=1;i<=m;i++){

		scanf("%d%d",&x,&y);

		k = lg[y - x + 1]-1;

		r = S[x][k];

		if(S[y - (1<<k)+1][k] < S[x][k]) r = S[y - (1<<k)+1][k];

		printf("%d\n",r);

	}

	return 0;

}