Cod sursa(job #159765)

Utilizator raduzerRadu Zernoveanu raduzer Data 14 martie 2008 13:12:01
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include <stdio.h>

int n,m,d[100001][18],x,p,y,min,val;

inline 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)
	{
		val=1<<j;
		for (i=1; i<=n; ++i) 
		{
			min=d[i][j-1];
			if (i+(val>>1)<=n && min>d[i+(val>>1)][j-1]) min=d[i+(val>>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<=n; ++p);
		printf("%d\n",mn(d[x][p],d[y-(1<<p)+1][p]));
	}
	return 0;
}