Cod sursa(job #593822)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 4 iunie 2011 16:41:25
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
/*varianta cu arbori de intervale*/

#include <cstdio>

const int ARB = 1<<18;
const int N = 100005;
const int INF = 2000000000;

int arb[ARB];
int poz_frunza[N]; int n;

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

int x,y;
void create(int a, int b, int poz)
{
	arb[poz] = INF;
	if (a == b)
	{
		poz_frunza[a] = poz;
		return;
	}
	int mij = (a+b)/2;
	create(a,mij,2*poz);
	create(mij+1,b,2*poz+1);
}

inline void creare()
{
	create(1,n,1);
}

int query(int a, int b, int poz)
{
	if ((x <= a)&&(b <= y))//inclus complet
		return arb[poz];
	if ((b < x)||(y < a))//inutil
		return INF;
	int mij = (a+b)/2;
	return min( query(a,mij,2*poz) , query(mij+1,b,2*poz+1) );
}

int interogare(int poz_x, int poz_y)
{
	x = poz_x;
	y = poz_y;
	return query(1,n,1);
}

void actualizare(int i, int val)
{
	int poz = poz_frunza[i];
	arb[poz] = val;
	poz /= 2;
	while (poz > 0)
	{
		arb[poz] = min(arb[2*poz],arb[2*poz+1]);
		poz /= 2;
	}
}

int m;

void adaugare_valori()
{
	int val;
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d",&val);
		actualizare(i,val);
	}
}

void raspundere()
{
	int a,b;
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",interogare(a,b));
	}
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	creare();
	adaugare_valori();
	raspundere();
	return 0;
}