Cod sursa(job #186615)

Utilizator andrei_h5n1Haidau Andrei andrei_h5n1 Data 28 aprilie 2008 14:18:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

#define maxn 100010
#define min(a, b) a<b ? a:b

int m[maxn][18], lo[maxn];

//long logaritm(long );
//int count(long );
int main()
{
	int n, m1, x, y, i, j;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	scanf("%d %d", &n, &m1);
	for(i=1; i<=n; ++i)
	{
		scanf("%d", &m[i][0]);
	}

	lo[1]=0;
	for(i=2; i<=n; i++)
		lo[i]=lo[i/2]+1;

//	for(i=1; i<=n; i++)
  //		m[i][0]=a[i];

	for(j=1; (1<<j) <= n; j++)
		for(i=1; i+ (1 << (j-1)) <=n; i++)
			m[i][j]=min(m[i][j-1], m[i+(1<<(j-1))][j-1]);

	for(i=1; i<=m1; i++)
	{
		scanf("%d %d", &x, &y);
		long k=lo[y-x];
		printf("%d\n", min(m[x][k], m[y-(1<<k)+1][k]));
	}

	return 0;
}                     /*
long logaritm(long n)
{
	n=n|(n>>1);
	n=n|(n>>2);
	n=n|(n>>4);
	n=n|(n>>8);
	n=n|(n>>16);
	return count(n);
}
int count(long n)
{
	int nr=0;

	if(n)
	while(n&=n-1) nr++;

	return nr;
}                       */