Cod sursa(job #432236)

Utilizator ironhideAfterBurner ironhide Data 1 aprilie 2010 23:25:27
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <stdio.h>

long min(long x,long y)
{
	if(x<y) return x;
	else return y;
}

long M,N,P,x,y,A[20][100002],i,j,d1,d2,nr1,nr2;

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%ld%ld",&N,&M);
	for(i=1;i<=N;i++) scanf("%ld",&A[0][i]);
	P=0;
	while(1<<P<=N) P++;
	P--;
	for(i=1;i<=P;i++)
		for(j=1;j<=N-(1<<(i-1));j++)
			A[i][j]=min(A[i-1][j],A[i-1][j+(1<<(i-1))]);
	for(i=1;i<=M;i++)
	{
		scanf("%ld%ld",&x,&y);
		P=0;
		while(1<<P<y) P++;
		P--;
		d1=(1<<P)-x+1;
		nr1=0;
		while(d1%2==0&&d1)
		{
			d1/=2;
			nr1++;
		}
		d2=y-(1<<P);
		nr2=0;
		while(d2%2==0&&d2)
		{
			d2/=2;
			nr2++;
		}
		printf("%ld\n",min(A[nr1][x],A[nr2][(1<<P)+1]));
	}
	return 0;
}