Cod sursa(job #1090084)

Utilizator NicuCJNicu B. NicuCJ Data 22 ianuarie 2014 12:34:18
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
using namespace std;

int arbint[400001], mn;
void update(int stanga, int dreapta, int pozitie, int valoare, int nivel)
{
	if(stanga == dreapta)
	{
		arbint[nivel] = valoare;
		return;
	}
	int mijloc = (stanga + dreapta) / 2;
	if(pozitie <= mijloc)
		update(stanga, mijloc, pozitie, valoare, nivel*2);
	if(pozitie > mijloc)
		update(mijloc+1, dreapta, pozitie, valoare, nivel*2+1);
	arbint[nivel] = arbint[2*nivel]<arbint[2*nivel+1]?arbint[2*nivel]:arbint[2*nivel+1];
}
void query(int stanga, int dreapta, int stangaInt, int dreaptaInt, int nivel)
{
	if(stanga >= stangaInt && dreapta <= dreaptaInt)
	{
		if(mn > arbint[nivel])
			mn = arbint[nivel];
		return;
	}
	int mijloc = (stanga + dreapta) / 2;
	if(stangaInt <= mijloc)
		query(stanga, mijloc, stangaInt, dreaptaInt, nivel*2);
	if(dreaptaInt > mijloc)
		query(mijloc+1, dreapta, stangaInt, dreaptaInt, nivel*2+1);
}
int main()
{
	int n, m, i, element, stangaInt, dreaptaInt;
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	f >> n >> m;
	for(i = 1; i <= n; i++)
	{
		f >> element;
		update(1, n, i, element, 1);
	}
	for(i = 1; i <= m; i++)
	{
		f >> stangaInt >> dreaptaInt;
		mn = 9999999;
		query(1, n, stangaInt, dreaptaInt, 1);
		g << mn <<"\n";
	}
}