Cod sursa(job #154882)

Utilizator ScrazyRobert Szasz Scrazy Data 11 martie 2008 15:55:21
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#define nm 100010
#define inf 0x3f3f3f3f

long T[4*nm];
long A[nm];

long n, m;
long mm;

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

void build(long n, long e, long u)
{
	if (e==u) T[n]=A[e];
	else
	{
		long mid=(e+u)>>1;
		build(2*n, e, mid);
		build(2*n+1, mid+1, u);

		if (T[2*n]<T[2*n+1])
			T[n]=T[2*n];
		else
			T[n]=T[2*n+1];
	}
}
void query(long n, long e, long u, long i, long j)
{
	if (i<=e && u<=j) mm=min(mm,T[n]);
	else
	{
		long mid=(e+u)>>1;
		if (i<=mid) query(2*n, e, mid, i, j);
		if (j>mid) query(2*n+1, mid+1, u, i, j);
	}
}

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

	scanf("%ld%ld", &n, &m);
	long i;
	for (i=1; i<=n; ++i) scanf("%ld", A+i);

	build(1,1,n);

	for (i=1; i<=m; ++i)
	{
		long x, y;
		scanf("%ld%ld", &x, &y);
		mm=inf;
		query(1,1,n,x,y);
		printf("%ld\n", mm);
	}

	return 0;
}