Cod sursa(job #219526)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 7 noiembrie 2008 10:53:22
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
long n, m, i, j, aa, bb, x, t[400010], init[100010];
int tip;

void initializeaza(long st, long dr, long poz);
long interogare(long p, long a, long b);
void modif(long p, long val);
long min(long a, long b);

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	initializeaza(1, n, 1);
	for (i=1; i<=n; i++)
	{
		scanf("%ld", &x);
		modif(init[i], x);
	}//for i
	for (i=0; i<m; i++)
	{
		scanf("%ld%ld", &aa, &bb);
		printf("%ld\n", interogare(1, 1, n));
	}//for i
	return 0;
}//main

void initializeaza(long st, long dr, long poz)
{
	long mij=(st+dr)/2;
	if (st==dr)
		init[st]=poz;
	else
	{
		initializeaza(st, mij, poz*2);
		initializeaza(mij+1, dr, poz*2+1);
	}//else
}//initializeaza

void modif(long p, long val)
{
	t[p]=val;
	p/=2;
	while (p>0)
	{
		t[p]=min(t[p*2], t[p*2+1]);
		p/=2;
	}//while
}//modif

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

long interogare(long p, long a, long b)
{
	long mij=(a+b)/2, rez=1001000;
	if ((aa<=a)&&(b<=bb))
		return t[p];
	if (aa<=mij)
		rez=min(rez, interogare(2*p, a, mij));
	if (bb>mij)
		rez=min(rez, interogare(2*p+1, mij+1, b));
	return rez;
}//interogare