Cod sursa(job #1694467)

Utilizator DragosDADDorneanu Dragos - Andrei DragosDAD Data 25 aprilie 2016 15:01:52
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;

unsigned int *tree;

int min(int a, int b)
{
	if (a > b) {
		return b;
	}
	return a;
}

unsigned int buildTree(unsigned int *v, unsigned int node, int left, int right)
{
	if (left == right)
	{
		tree[node] = v[left];
		return v[left];
	}
	int mid = (left + right) / 2;
	int minLeft = buildTree(v, node * 2, left, mid);
	int minRight = buildTree(v, node * 2 + 1, mid + 1, right);
	tree[node] = min(minLeft, minRight);
	return tree[node];
}

int query(unsigned int *v, unsigned int node, int left, int right, unsigned int a, unsigned int b)
{
	if (a <= left && right <= b) {
		return tree[node];
	}
	int mid = (left + right) / 2;
	int minLeft = INT32_MAX, minRight = INT32_MAX;
	if (a <= mid) {
		minLeft = query(v, node * 2, left, mid, a, b);
	}
	if (mid < b) {
		minRight = query(v, node * 2 + 1, mid + 1, right, a, b);
	}
	return min(minLeft, minRight);
}

int main()
{
	ifstream fin("rmq.in");
	ofstream fout("rmq.out");
	unsigned int n, m, i;
	fin >> n >> m;
	unsigned int *v = new unsigned int[n + 1];
	for (i = 1; i <= n; ++i) {
		fin >> v[i];
	}
	tree = new unsigned int[3 * n + 1];
	buildTree(v, 1, 1, n);
	unsigned int a, b;
	while (m)
	{
		fin >> a >> b;
		fout << query(v, 1, 1, n, a, b) << '\n';
		--m;
	}
	fin.close();
	fout.close();
	return 0;
}