Pagini recente » Cod sursa (job #541291) | Cod sursa (job #2046290) | Cod sursa (job #135912) | Cod sursa (job #1869738) | Cod sursa (job #2793514)
#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;
}