Cod sursa(job #795287)

Utilizator radustn92Radu Stancu radustn92 Data 7 octombrie 2012 23:21:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#define NMAX 100005
#define LMAX 18
int n,m,A[NMAX],lg[NMAX];
int rmq[LMAX][NMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
}
inline int min(int x,int y)
{
	return x<y ? x : y;
}
void precompute()
{
	int i,j,val1,val2;
	for (i=1; i<=n; i++)
	{
		rmq[0][i]=A[i];
		lg[i]= (i>=2) ? lg[i/2]+1 : 0;
	}
	for (j=1; (1<<j)<=n; j++)
	{
		val1=1<<(j-1); val2=1<<j;
		for (i=1; i<=n-val2+1; i++)
			rmq[j][i]=min(rmq[j-1][i],rmq[j-1][i+val1]);
	}
}
void solve()
{
	int i,x,y,l;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d",&x,&y);
		l=lg[y-x+1];
		printf("%d\n",min(rmq[l][x],rmq[l][y-(1<<l)+1]));
	}
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	read();
	precompute();
	solve();
	return 0;
}