Cod sursa(job #154982)

Utilizator oumbraPaul Filimoon oumbra Data 11 martie 2008 17:11:21
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <cstring>
#include <cmath>

#define log2(a) (int) (log(a)/log(2))

int n, m, qstart, qstop;

int v[300005][18];

inline int min(int a, int b)
{
	if(a < b)
		return a;
	else	
		return b;
}

void read()
{
	int t1;

	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	scanf("%d%d", &n, &m);

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

void readquery()
{
	scanf("%d%d", &qstart, &qstop);
}

int main()
{
	int i, j;

	memset(v, 1000005, sizeof(v));

	

	read();

	for(j = 1; j <= 17; j++)
	{
		for(i = 1; i <= n; i++)
		{
			v[i][j] = min(v[i][j-1], v[i + (1 << (j-1))][j-1]);
		}
	}	

	while(m)
	{
		readquery();
		fprintf(stderr, "qstart=%d, qstop=%d\nm1i=%d, m1j=%d, m1=%d\nm2i=%d, m2j=%d, m2=%d\n",
			qstart, qstop, qstart, log2(qstop-qstart), v[qstart][log2(qstop-qstart)],
			qstop-((int) pow(2, log2(qstop-qstart)-1 )), log2(qstop-qstart),
			v[qstop-((int) pow(2, log2(qstop-qstart)-1 ))][log2(qstop-qstart)]
		);

		printf("%d\n", 
			min(
				v[qstart][log2(qstop-qstart)],
				v[qstop-((int) pow(2, log2(qstop-qstart)-1 ))][log2(qstop-qstart)]
			
			)
		);

		m--;
	}

	return 0;
}