Cod sursa(job #681562)

Utilizator an_drey_curentandreycurent an_drey_curent Data 17 februarie 2012 13:47:45
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#define MAX 100000
#define LGMAX 20
int X,Y,N,M,v[MAX+3],dp[MAX+3][LGMAX+3],LG[MAX+3];
int minim(int x,int y)
{
	if(v[x]<v[y]) return x; return y;
}
void deschidere()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
}
void citire()
{
	scanf("%d%d",&N,&M);
	for(int i=0;i<N;i++)
		scanf("%d",&v[i]);
}
void initializare()
{
	LG[1]=0;
	for(int i=0;i<N;i++)
	{
		dp[i][0]=i;
		if(i>=2)
			LG[i]=LG[i/2]+1;
	}
	LG[N]=LG[N/2]+1;
}
void rmq()
{
	int i,j;
	for(j=1; (1<<j) <= N;j++)
		for(i=0; i+ (1<<j)-1 < N;i++)
			dp[i][j]=minim(dp[i][j-1],dp[i+(1<<j)][j-1]);
}
void rezolva()
{
	while(M--)
	{
		scanf("%d%d",&X,&Y);
		X--;Y--;
		int aux=LG[Y-X];
		printf("%d\n",v[minim(dp[X][aux],dp[Y-(1<<aux)+1][aux])]);
	}
}
int main()
{
	deschidere();
	citire();
	initializare();
	rmq();
	rezolva();
	return 0;
}