Cod sursa(job #1251049)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 28 octombrie 2014 21:32:50
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
using namespace std;

const int NMAX = 100000;
int ArbInt[4 * NMAX];
int v[NMAX];
int n, m;

int build (int nod, int st, int dr)
{
	if (dr - st < 1)
	{
		ArbInt[nod] = v[st];
		return v[st];
	}

	int mid = (st + dr) / 2;

	int vl = build (nod * 2 + 1, st, mid);
	int vr = build (nod * 2 + 2, mid + 1, dr);

	ArbInt[nod] = min (vl, vr);
	return ArbInt[nod];
}

bool intersect (int x1, int y1, int x2, int y2)
{
	return x2 <= y1 && x1 <= y2;
}

bool suprapun (int x1, int y1, int x2, int y2)
{
	return x2 <= y1 && x1 >= x2 && y2 >= y1;
}

int query(int nod, int st, int dr, int a, int b)
{
	if (suprapun (st, dr, a, b))
		return ArbInt[nod];

	int mid = (st + dr) >> 1; 
	
	int p1 = 0x7fffffff, p2 = 0x7fffffff;
	
	if (intersect(a, b, st, mid))
		p1 = query (nod * 2 + 1, st, mid, a, b);
	
	if (intersect(a, b, mid + 1, dr))
		p2 = query (nod * 2 + 2, mid + 1, dr, a, b);

	return min(p1, p2);
}

void createArbInt()
{
	build(0, 0, n - 1);
}

int main()
{
	ifstream in("arbint.in");
	ofstream out("arbint.out");

	in >> n >> m;
	for (int i = 0; i < n; ++i)
		in >> v[i];

	createArbInt();

	for (int i = 0; i < m; i++)
	{
		int x, y; 
		in >> x >> y;
		
		out << query(0, 0, n - 1, x - 1, y - 1) << "\n";
	}

	return 0;
}