Cod sursa(job #2793514)

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

template <class T> class RMQ
{
private:
	T** rmq;
	int rMax, length;
	const T& (*compare)(const T&, const T&);
public:
	RMQ()
	{
		rmq = NULL;
		compare = NULL;
		rMax = 0;
		length = 0;
	}
	RMQ(T vector[], int length, const T& (*compare)(const T&, const T&))
	{
		this->length = length;
		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(const RMQ& copyRmq)
	{
		this->compare = copyRmq.compare;
		this->rMax = copyRmq.rMax;
		this->length = copyRmq.length;
		
		rmq = new T * [rMax + 1];
		rmq[0] = new int[length + 1];
		for (int i = 1; i <= length; i++)
			rmq[0][i] = copyRmq.rmq[0][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] = copyRmq.rmq[r][i];
		}
	}
	void operator =(const RMQ& copyRmq)
	{
		if (rmq != NULL)
		{
			for (int i = 0; i <= rMax; i++)
				delete[] rmq[i];

			delete[] rmq;
		}
		this->rmq = NULL;
		this->compare = copyRmq.compare;
		this->rMax = copyRmq.rMax;
		this->length = copyRmq.length;

		rmq = new T * [rMax + 1];
		rmq[0] = new int[length + 1];
		for (int i = 1; i <= length; i++)
			rmq[0][i] = copyRmq.rmq[0][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] = copyRmq.rmq[r][i];
		}
	}
	~RMQ()
	{
		if (rmq != NULL)
		{
			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;
}