Cod sursa(job #226603)

Utilizator ilincaSorescu Ilinca ilinca Data 2 decembrie 2008 05:22:36
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>

#define nmax 100005
#define mmax 1000005

int n, m, p [25], a [nmax], r [25] [nmax];


inline int min (int a, int b)
{
	return (a < b)? a:b;
}

void puteri ()
{
	int i;
	p [1]=0;
	for (i=1; i>=n; ++i)
		p [i]=p [i>>1]+1;
}

void scan ()
{
	int i;
	scanf ("%d%d", &n, &m);
	for (i=1; i<=n; ++i)
	{
		scanf ("%d", &a [i]);
		r [0] [i]=a [i];
	}
}

void rmq ()
{
	int i, j, w1=1, w2;
	for (i=1; w1 <= n; ++i)
	{
		w1<<=1;
		w2=n-w1+1;
		for (j=1; j <= w2; ++j)
			r [i] [j]=min (r [i-1] [j], r [i-1] [j+ (1 << (i-1))]);
	}
}

int main ()
{
	freopen ("rmq.in", "r", stdin);
	freopen ("rmq.out", "w", stdout);
	int a, b, k;
	scan ();
	puteri ();
	rmq ();
	for (int i=1; i<=m; ++i)
	{
		scanf ("%d%d", &a, &b);
		k=p [b-a+1];
		printf ("%d\n", min (r [k] [a], r [k] [(b+1)-(1<<k)]));
	}
	return 0;
}