Cod sursa(job #2091703)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 20 decembrie 2017 08:57:55
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 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];

void update(int index, int val, int nod, int l, int r)
{
	if(l == r) {
		aint[nod] = val;
		return;
	}

	int mid = (l + r) >> 1;

	if(index <= mid)
		update(index, val, 2 * nod, l, mid);
	else
		update(index, val, 2 * nod + 1, mid + 1, r);
	
	aint[nod] = min(aint[2 * nod], aint[2 * nod + 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) {
		int x;
		in >> x;
		update(i, x, 1, 1, n);
	}

	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;
}