Cod sursa(job #1418822)

Utilizator phobosJustin Lim Kai Ze phobos Data 14 aprilie 2015 08:59:57
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MX = 1e5+1;
int M[MX], A[MX], n, m;

void build(int node, int b, int e) {
	if (b == e) {
		M[node] = A[b];
	}
	else {
		build(2*node, b, (b+e)/2);
		build(2*node+1, (b+e)/2+1, e);
		M[node] = min(M[2*node], M[2*node+1]);
	}
}

int query(int node, int b, int e, int i, int j) {
	if (i > e || j < b) {
		return -1;
	}
	if (i <= b && e <= j) {
		return M[node];
	}
	int l, r;
	l = query(2*node, b, (b+e)/2, i, j);
	r = query(2*node+1, (b+e)/2+1, e, i, j);
	if (l == -1) return r;
	if (r == -1) return l;
	return min(l, r);
}

int main() {
	ifstream in("rmq.in");
	ofstream out("rmq.out");
	in >> n >> m;
	for (int i = 0; i < n; i++) {
		in >> A[i];
	}
	build(1, 0, n-1);
	int x, y;
	for (int i = 0; i < m; i++) {
		in >> x >> y;
		out << query(1, 0, n-1, x-1, y-1) << '\n';
	}
	return 0;
}