Cod sursa(job #2788744)

Utilizator Rares31100Popa Rares Rares31100 Data 26 octombrie 2021 13:15:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;

template <class T> class RMQ
{
private:
	T** rmq;
	int rMax;
	const T& (*compare)(const T&, const T&);
public:
	RMQ(T vector[], int length, const T& (*compare)(const T&, const T&))
	{
		this -> compare = compare;
		rMax = log2(length);
		rmq = new T * [rMax + 1];

		rmq[0] = new int[length + 1];
		for (int i = 1; i <= length; i++)
			rmq[0][i] = vector[i];

		for (int r = 1, l = 1; r <= rMax; r++, l *= 2)
		{
			rmq[r] = new int[length - l * 2 + 2];
			for (int i = 1; i <= length - l * 2 + 1; i++)
				rmq[r][i] = compare(rmq[r - 1][i], rmq[r - 1][i + l]);
		}
	}
	~RMQ()
	{
		for (int i = 0; i <= rMax; i++)
			delete[] rmq[i];

		delete[] rmq;
	}
	T query(int st, int dr)
	{
		int r = log2(dr - st + 1);
		return compare(rmq[r][st], rmq[r][dr - (1 << r) + 1]);
	}
};

int n, q, a[100001];
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int main()
{
	fin >> n >> q;

	for (int i = 1; i <= n; i++)
		fin >> a[i];

	RMQ <int> rmq(a, n, min);

	for (int st, dr; q; q--)
	{
		fin >> st >> dr;
		fout << rmq.query(st, dr) << '\n';
	}

	return 0;
}