Cod sursa(job #2181832)

Utilizator Seb16Ungureanu Paul Sebastian Seb16 Data 21 martie 2018 21:12:17
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#define N 100001

using namespace std;

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

int v[17][100001];
int n, m, x;

int logs[N];

void compute_logs() {
	logs[2] = 1;
	for (int i = 3; i < N; ++i) {
		logs[i] = logs[i - 1];
		if ((i & (i - 1)) == 0) {
			logs[i]++;
		}
	}
}

int main() {
	fin >> n >> m;
	for (int i = 0; i < n; ++i) {
		fin >> v[0][i];
	}

	compute_logs();

	for (int i = 1; (1 << (i - 1)) <= n; ++i) {
		for (int j = 0; j < n - (1 << (i - 1)); ++j) {
			v[i][j] = min(v[i - 1][j], v[i - 1][j + (1 << (i - 1))]);
		}
	}

	int p, q;
	for (int i = 0; i < m; ++i) {
		fin >> p >> q;
		int ldif = logs[q - p];
		fout << min(v[ldif][p - 1], v[ldif][q - 1 - ldif]) << '\n';
	}
	return 0;
}