Cod sursa(job #1612118)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 24 februarie 2016 18:34:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <vector>
#include <array>
#include <cmath>
using namespace std;

constexpr int maxniv = 18;

class rmq{
	int n;
	vector<array<int, maxniv>> buf;
public:
	rmq(const vector<int>& v): n(v.size()), buf(n){
		for(int i = 0; i < n; ++i){
			buf[i][0] = v[i]; }
		for(int niv = 1, step = 1; niv < maxniv; ++niv, step *= 2){
			for(int i = 0, j = step; j < n; ++i, ++j){
				buf[i][niv] = min(buf[i][niv-1], buf[j][niv-1]); } } }
	int query(const int st, const int dr){
		const int niv = log2(dr-st+1), step = 1<<niv;
		return min(buf[st][niv], buf[dr-step+1][niv]); } };

int main(){
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	int n, m;
	f >> n >> m;

	vector<int> v(n);
	for(int i = 0; i < n; ++i){
		f >> v[i]; }

	rmq r(v);

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

	return 0; }