Cod sursa(job #1427468)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 2 mai 2015 12:35:21
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <cmath>

#define MaxN 100005

using namespace std;

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

int N, M, aib[2 * MaxN + 100], minn, x, l ,r;

int min(int a, int b) {
	return a < b ? a : b;
}

void update(int node, int left, int right, int pos, int value) {
	if (left == right) {
		aib[node] = value;
		return;
	}

	int middle = left + (right - left) / 2;
	if (pos <= middle)
		update(2 * node, left, middle, pos, value);
	else
		update(2 * node + 1, middle + 1, right, pos, value);
	aib[node] = min(aib[2 * node], aib[2 * node + 1]);
}

void query(int node, int start, int end, int left, int right) {
	if (left <= start && end <= right) {
		minn = min(minn, aib[node]);
		return;
	}

	int middle = start + (end - start) / 2;
	if (left <= middle)
		query(2 * node, start, middle, left, right);
	if (middle < right)
		query(2 * node + 1, middle + 1, end, left, right);
}

int main() {
	fin >> N >> M;
	
	for (int i = 1; i <= N; ++i) {
		fin >> x;
		update(1, 1, N, i, x);
	}

	for (int j = 0; j < M; ++j) {
		fin >> l >> r;
		minn = ~(1 << 31);
		query(1, 1, N, l, r);
		fout << minn << '\n';
	}

	return 0;
}