Cod sursa(job #2151587)

Utilizator DenisacheDenis Ehorovici Denisache Data 4 martie 2018 17:34:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
#include <bitset>
#include <set>

using namespace std;



int main() {
	ios::sync_with_stdio(false);

	string filename = "rmq";

	ifstream fin(filename + ".in");
	ofstream fout(filename + ".out");

	int n;
	fin >> n;

	int m;
	fin >> m;

	vector<int> vec(n);

	for (int i = 0; i < n; ++i)
		fin >> vec[i];

	vector<int> lg(n + 1);

	for (int i = 2; i <= n; ++i)
		lg[i] = lg[i / 2] + 1;

	vector< vector<int> > RMQ(lg[n] + 1);

	RMQ[0].resize(n);
	
	for (int i = 0; i < n; ++i)
		RMQ[0][i] = i;

	for (int i = 1; i <= lg[n]; ++i) {
		for (int j = 0; j + (1 << i) - 1 < n; ++j) {
			int l = 1 << (i - 1);

			int res = ((vec[RMQ[i - 1][j]] < vec[RMQ[i - 1][j + l]]) ? RMQ[i - 1][j] : RMQ[i - 1][j + l]);

			RMQ[i].push_back(res);
		}
	}

	while (m--) {
		int L, R;
		fin >> L >> R;
		--L; --R;

		int k = lg[R - L + 1];
		int remaining = R - (L + (1 << k) - 1);
		// L + 2^k - 1 is the index of the last element we reach starting from L
		// R - last index = nr of remaining elements

		if (vec[RMQ[k][L]] < vec[RMQ[k][L + remaining]])
			fout << vec[RMQ[k][L]] << "\n";
		else
			fout << vec[RMQ[k][L + remaining]] << "\n";
	}

	//system("pause");
	return 0;
}