Cod sursa(job #2080702)

Utilizator ice_creamIce Cream ice_cream Data 3 decembrie 2017 14:11:59
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000 + 1;
const int PMAX = 17;

int n, m;
int v[NMAX];
int logaritm[NMAX];
int rmq[PMAX][NMAX];

void citeste() {
	f >> n >> m;
	for (int i = 1; i <= n; i++) 
		f >> rmq[0][i];
}

void init_rmq() {
	for (int i = 2; i <= n; i++) logaritm[i] = logaritm[i / 2] + 1;
	for (int p = 1; 1 << p <= n; p++) {
		int l = 1 << (p - 1);
		for (int i = 1; i <= n - l + 1; i++) {
			rmq[p][i] = min(rmq[p - 1][i], rmq[p - 1][i + l]);
		}
	}
}

int query(int a, int b) {
	int l = b - a + 1;
	int p = logaritm[l];
	return min(rmq[p][a], rmq[p][b - (1 << p) + 1]);
}

void rezolva() {
	int a, b;

	for (int i = 1; i <= m; i++) {
		f >> a >> b;
		g << query(a, b) << '\n';
	}
}

int main() {
	citeste();
	init_rmq();
	rezolva();
	return 0;
}