Cod sursa(job #169736)

Utilizator hadesgamesTache Alexandru hadesgames Data 1 aprilie 2008 21:53:56
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.64 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;
}