Cod sursa(job #266959)

Utilizator ZillaMathe Bogdan Zilla Data 26 februarie 2009 14:36:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <stdio.h>

#define Nmax 100200
#define Lmax 18
#define pow(q) (1<<(q))
//#define INF 10000


int n,m,b[Nmax][Lmax];

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

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	int x,y,i,j;

	scanf("%d%d",&n,&m);
//	for(i=n+1;i<Nmax;++i)b[i][0]=INF;

	for(i=1;i<=n;++i)
		scanf("%d",&b[i][0]);
	for(j=1;pow(j)<=n;++j)
		for(i=1;i<=n;++i)
			{
				b[i][j]=b[i][j-1];
				if (i+pow(j-1)<=n && b[i][j] > b[i+pow(j-1)][j-1])
					b[i][j] = b[i+pow(j-1)][j-1];
            }
	for(i=1;i<=m;++i)
		{
			scanf("%d%d",&x,&y);
			int log=0,dif=y-x+1;
			while(pow(log+1)<=dif)
				++log;
			printf("%d\n",min(b[x][log],b[y-pow(log)+1][log]));
		}
	return 0;
}