Cod sursa(job #3262272)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 9 decembrie 2024 17:11:42
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

template<class T> class RMQ {
private:
	vector<vector<int>> t;
public:
	void build(const vector<int> &vals) {
		for(int i = 1; i < (int)vals.size(); i++) {
			t[i][0] = vals[i];
		}
		for(int j = 1; (1 << j) < (int)vals.size(); j++) {
			for(int i = 1; i < (int)vals.size() - (1 << j) + 1; i++) {
				t[i][j] = min(t[i][j - 1], t[i + (1 << (j - 1))][j - 1]);
			}
		}
	}
	int query(int x, int y) {
		int lg = 0, diff = y - x;
		while(diff >>= 1) { lg++; } 
		return min(t[x][lg], t[y - (1 << lg) + 1][lg]);
	}
	RMQ(const vector<int> &vals) {
		int sz = 0;
		while((1 << sz) < (int)vals.size()) { sz++; }
		t.resize((int)vals.size());
		for(int i = 1; i < (int)vals.size(); i++) {
			t[i].resize(sz);
		}
		build(vals);
	}
};

int main() {

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

	int n, m;
	in >> n >> m;

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

	RMQ<int> rmq(v);
	for(int i = 1; i <= m; i++) {
		int x, y;
		in >> x >> y;
		out << rmq.query(x, y) << '\n';
	}

	return 0;
}