Cod sursa(job #2036586)

Utilizator robuvedVictor Robu robuved Data 10 octombrie 2017 20:28:41
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

#define MAX 100000
int v[MAX], tree[4 * MAX];
int N, M;

void BuildTree(int node = 0, int left = 0, int right = N - 1)
{
	if (left == right)
	{
		tree[node] = v[left];
		return;
	}
	int mid = (left + right) / 2;
	BuildTree(2 * node + 1, left, mid);
	BuildTree(2 * node + 2, mid + 1, right);

	tree[node] = min(tree[2 * node + 1], tree[2 * node + 2]);
}
int Query(int x, int y, int node = 0, int left = 0, int right = N - 1)
{
	if (left >= x && right <= y)
		return tree[node];

	int mid = (left + right) / 2;

	if (y <= mid)
		return Query(x, y, 2 * node + 1, left, mid);
	if (x > mid)
		return Query(x, y, 2 * node + 2, mid + 1, right);

	return min(Query(x, y, 2 * node + 1, left, mid),
		Query(x, y, 2 * node + 2, mid + 1, right));
}
int main()
{
	in >> N >> M;
	for (int i = 0; i < N; i++)
	{
		in >> v[i];
	}
	BuildTree();
	for (int i = 0; i < M; i++)
	{
		int l, r;
		in >> l >> r;
		out << Query(l - 1, r - 1) << '\n';
	}
}