Cod sursa(job #2616098)

Utilizator MicuMicuda Andrei Micu Data 16 mai 2020 17:58:48
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100001;

#define min(a, b) ((a) < (b) ? (a) : (b))

int v[NMAX], tree[2 * NMAX];

void buildArbInt(int node, int st, int dr) {
	if (st == dr) {
		tree[node] = v[st];
	}
	else {
		int mid = (st + dr) / 2;
		buildArbInt(2 * node, st, mid);
		buildArbInt(2 * node + 1, mid + 1, dr);

		tree[node] = min(tree[2 * node], tree[2 * node + 1]);
	}
}

int RMQ(int node, int st, int dr, int qst, int qdr) {
	if (qst <= st && dr <= qdr) return tree[node];

	int mid = (st + dr) / 2;
	if (qdr <= mid) {
		return RMQ(2 * node, st, mid, qst, qdr);
	}
	else if (qst > mid) {
		return RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
	}
	else {
		int RMQst = RMQ(2 * node, st, mid, qst, qdr);
		int RMQdr = RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
		return min(RMQst, RMQdr);
	}
}

int main() {
	int n, m;
	in >> n >> m;
	for (int i = 0; i < n; i++) {
		in >> v[i];
	}
	buildArbInt(1, 0, n-1);

	for (int i = 0; i < m; i++) {
		int qst, qdr;
		in >> qst >> qdr;
		out << RMQ(1, 0, n - 1, qst - 1, qdr - 1) << '\n';
	}
	return 0;
}