Cod sursa(job #154883)

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

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

long n, m;

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

	for (j=1; (1<<j)<=n; ++j)
		for (int i=1; i+(1<<j)-1<=n; ++i)
			if (M[j-1][i]<M[j-1][i+(1<<(j-1))])
				M[j][i]=M[j-1][i];
			else
				M[j][i]=M[j-1][i+(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[k][x]<M[k][y-(1<<k)+1])
			printf("%ld\n", M[k][x]);
		else
			printf("%ld\n", M[k][y-(1<<k)+1]);
	}
	return 0;
}