Pagini recente » Romanian IOI Medalists: Careers | Cod sursa (job #3154353) | Cod sursa (job #908092) | Cod sursa (job #984417) | Cod sursa (job #2788744)
#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;
}