Cod sursa(job #309648)

Utilizator luk17Luca Bogdan luk17 Data 30 aprilie 2009 20:47:20
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.59 kb
#include<stdio.h>
#define NMAX 100001
#define min(a,b) a>b?b:a
int a[NMAX],m[15][NMAX],lg[NMAX],n,M;

int main()
{
	int i,j,x,y,dif,log;
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&M);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
	for(i=1;i<=n;i++)
		m[0][i]=a[i];
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j+(1<<i)<=n+1;j++)
			m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
	
	for(;M;M--)
	{
		scanf("%d%d",&x,&y);
		dif=y-x+1;
		log=lg[dif];
		printf("%d\n",min(m[log][x],m[log][x+dif-(1<<log)]));
	}
	return 0;
}