Cod sursa(job #338952)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 7 august 2009 16:30:13
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>

int log[100000];
int rmq[20][100000];
int a[100000];
int i,j,n,l,pas,x,y,t;

inline int min(int x, int y)
{
	if (x<y) return x;
	return y;
}

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