Cod sursa(job #159706)

Utilizator raduzerRadu Zernoveanu raduzer Data 14 martie 2008 12:28:58
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.58 kb
#include <stdio.h>

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

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+(1<<j)<=n, i<=n; ++i) 
			d[i][j]=mn(d[i][j-1],d[i+(1<<(j-1))][j-1]);
	}
	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;
}