Cod sursa(job #1756557)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 13 septembrie 2016 00:33:26
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>	
#include <cstdio>
#include <vector>
#include <stack>
#include <cassert>
#include <algorithm>
using namespace std;

class Rmq {
 public:
	Rmq(const vector<int> &nums) {
		int k = int(log(nums.size()) / log(2));
		m_.resize(nums.size(), vector<int>(k + 1, 0));
		for (int i = 0; i < nums.size(); ++i) {
			m_[i][0] = nums[i];
		}
	}
	void Calculate() {
		// Calculate segments of length 2^k
		for (int k = 1; k < m_[0].size(); ++k) {
			for (int i = 0; i + 1 << (k - 1) < m_.size(); ++i) {
				m_[i][k] = min(m_[i][k - 1], m_[i + (1 << (k - 1))][k - 1]);
			}
		}
	}
	int Query(int left, int right) {
		if (left > right) {
			swap(left, right);
		}
		int k = int(log(right - left + 1) / log(2));
		return min(m_[left][k], m_[right -  (1 << k) + 1][k]);
	}
	void Debug() {
		for (int i = 0; i < m_.size(); ++i, printf("\n")) {
			for (int j = 0; j < m_[i].size(); ++j) {
				printf("%d ", m_[i][j]);
			}
		}
	}
 private:
	vector<vector<int>> m_;
};

int main() {
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	int n, m, x, y;
	vector<int> nums;
	scanf("%d %d", &n, &m);
	nums.resize(n);
	for (int i = 0; i < n; ++i) {
		scanf("%d", &nums[i]);
	}
	Rmq *instance = new Rmq(nums);
	instance->Calculate();
	for (int i = 0; i < m; ++i) {
		scanf("%d %d", &x, &y);
		printf("%d\n", instance->Query(x-1, y-1));
	}
	//instance->Debug();
	
	return 0;
}