Cod sursa(job #2091701)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 20 decembrie 2017 08:55:49
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMax = 1e5 + 5;
int n, m, aint[4 * NMax], arr[NMax];

void buildTree(int l, int r, int poz)
{
	if(l == r) {
		aint[poz] = arr[l];
		return;
	}

	int mid = (l + r ) >> 1;
	buildTree(l, mid, 2 * poz);
	buildTree(mid + 1, r, 2 * poz + 1);

	aint[poz] = min(aint[2 * poz], aint[2 * poz + 1]);
}

int query(int nod, int l, int r, int a, int b)
{
	if(a <= l && r <= b)
		return aint[nod];
	if(a > r || b < l)
		return INT_MAX;

	int mid = (l + r) >> 1;
	return min(query(2 * nod, l, mid, a, b), query(2 * nod + 1, mid + 1, r, a ,b));
}

int main()
{
	in >> n >> m;

	for(int i = 1; i <= n; ++i)
		in >> arr[i];

	buildTree(1, n, 1);

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

	in.close(); out.close();

	return 0;
}