Cod sursa(job #154858)

Utilizator ScrazyRobert Szasz Scrazy Data 11 martie 2008 15:34:03
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <stdio.h>
#define nm 100010

long A[nm];
long M[nm][20];
int Lg[20];

long n, m;

void preproc()
{
	int i, j;
	for (i=1; i<=n; ++i)
		M[i][0]=A[i];

	for (j=1; (1<<j)<=n; ++j)
		for (int i=1; i+(1<<j)-1<=n; ++i)
			if (M[i][j-1]<M[i+(1<<(j-1))][j-1])
				M[i][j]=M[i][j-1];
			else
				M[i][j]=M[i+(1<<(j-1))][j-1];
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	scanf("%ld%ld", &n, &m);
	int i;
	for (i=1; i<=n; ++i) scanf("%ld", A+i);
	preproc();
	for (i=2; i<=n; ++i) Lg[i]=Lg[i/2]+1;

	for (i=1; i<=m; ++i)
	{
		long x, y;
		scanf("%ld%ld", &x, &y);
		int k=Lg[y-x+1];
		if (M[x][k]<M[y-(1<<k)+1][k])
			printf("%ld\n", M[x][k]);
		else
			printf("%ld\n", M[y-(1<<k)+1][k]);
	}
	return 0;
}