Cod sursa(job #201280)

Utilizator AndreyPAndrei Poenaru AndreyP Data 30 iulie 2008 10:40:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include<stdio.h>
#define L 20
#define N 100005
int n,m,x,y;
int a[L][N];
int lg[N];
int v[N];
inline int min(int x,int y)
{
	if(x<y)
		return x;
	return y;
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j,aux,aux1;
	for(i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		a[0][i]=v[i];
	}
	
	for(i=2; i<=n; i++)
		lg[i]=lg[i>>1]+1;
	
	for(i=1; i<=lg[n]; i++)
	{
		aux=n-(1<<i)+1;
		aux1=1<<(i-1);
		for(j=1; j<=aux; j++)
			a[i][j]=min(a[i-1][j],a[i-1][j+aux1]);
	}
	int log,dif;
	for(i=0; i<m; i++)
	{
		scanf("%d%d",&x,&y);
		dif=y-x+1;
		log=lg[dif];
		printf("%d\n",min(a[log][x],a[log][x+dif-(1<<log)]));
	}
	return 0;
}