Cod sursa(job #2181854)

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

using namespace std;

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

int v[18][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 = 1; i <= n; ++i) {
		fin >> v[0][i];
	}
	compute_logs();

	for (int i = 1; (1 << (i - 1)) <= n; ++i) {
		for (int j = 1; j <= n + 1 - (1 << i); ++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], v[ldif][q - ldif]) << '\n';
	}
	return 0;
}