Cod sursa(job #743258)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 3 mai 2012 20:15:03
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>


inline int min(int a, int b)
{
	if(a<=b)
		return a;
	return b;
}


inline int pow2(int a)
{
	int i;
	for(i=1;i<=a;i=i*2);
	return i;
}


inline int log(int a)
{
	int i=0;
	while(a!=1)
	{
		a=a/2;
		++i;
	}
	return i;
}
	



int a[20][100005];





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