Cod sursa(job #2626314)

Utilizator StefanaArinaStefana Arina Tabusca StefanaArina Data 6 iunie 2020 13:19:59
Problema Range minimum query Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.18 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;
}