Cod sursa(job #403824)

Utilizator test9cTester test9c Data 25 februarie 2010 13:04:29
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#define nmax 100004
#define min(a,b) (a<=b)?a:b
int arb[nmax*4+15], n, m, sol;

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

void update(int val, int poz, int nod, int s, int d)
{	int mj;
	if(s==d)
	{	arb[nod]=val;
		return;
	}
	mj=(s+d)/2;
	if(poz<=mj)	update(val, poz, 2*nod, s, mj);
	else		update(val, poz, 2*nod+1, mj+1, d);
	arb[nod]=min(arb[2*nod], arb[2*nod+1]);
}

void find(int nod, int s, int d, int a, int b)
{	int mj;
	if(s>=a && d<=b)
	{	if(sol>arb[nod])	sol=arb[nod];
		return;
	}
	else
{
	mj=(s+d)/2;
	if(a<=mj) find(2*nod, s, mj, a, b);
	if(b>mj)  find(2*nod+1, mj+1, d, a, b);
}
}


int main ()
{	int i, a, b;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(i=1; i<=n; i++)
	{	scanf("%d", &a);
		update(a, i, 1, 1, n);
	}
	for(i=0; i<m; i++)
	{	scanf("%d%d", &a, &b);
		sol=100010;
		find(1, 1, n, a, b);
		printf("%d\n", sol);
	}	
	return 0;
	
}