Cod sursa(job #550451)

Utilizator skullLepadat Mihai-Alexandru skull Data 9 martie 2011 16:17:31
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define nmax 100005
#define INF 2000000000

int arb[4*nmax];
int N, M;

void update (int ind, int st, int dr, int poz, int val)
{
	if (st == dr) { arb[ind] = val; return; }
	int mij = (st+dr)/2;
	if (poz <= mij) update(2*ind, st, mij, poz, val);
		else update(2*ind+1, mij+1, dr, poz, val);
	arb[ind] = min(arb[2*ind], arb[2*ind+1]);
}

int query (int ind, int st, int dr, int a, int b)
{
	if (a<=st && dr<=b) return (arb[ind]);
	int mij = (st+dr)/2, m1 = INF, m2 = INF;
	if (a <= mij) m1 = query(2*ind, st, mij, a, b);
	if (b > mij) m2 = query(2*ind+1, mij+1, dr, a, b);
	return min(m1, m2);
}

void citire ()
{
	int i, x;
	scanf("%d%d", &N, &M);
	memset(arb, 1, sizeof(arb) );
	for (i = 1; i <= N; ++i) 
	{
		scanf("%d", &x);
		update(1,1,N,i,x);
	}
}

void solve ()
{
	int i, a, b;
	for (i = 1; i <= M; ++i)
	{
		scanf("%d%d", &a, &b);
		printf("%d\n", query(1, 1, N, a, b) );
	}
}

int main ()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	citire ();
	solve ();
	return 0;
}