Cod sursa(job #159749)

Utilizator raduzerRadu Zernoveanu raduzer Data 14 martie 2008 12:59:44
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.64 kb
#include <stdio.h>

int n,m,d[100010][32],x,p,y,min;

int mn(int a, int b)
{
	if (a>b) return b;
	else return a;
}

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