Pagini recente » Cod sursa (job #227542) | Cod sursa (job #1733235) | Cod sursa (job #241305) | Cod sursa (job #2163087) | Cod sursa (job #1742145)
#include <bits/stdc++.h>
using namespace std;
constexpr int MAX_LG = 17;
constexpr int MAX_N = 100000 + 1;
class RangeMinimumQuery
{
private:
vector< vector<int> > rmq;
vector<int> _log2;
int N;
public:
RangeMinimumQuery(int N)
{
this->N = N;
rmq.resize(17);
for (int i = 0; i < rmq.size(); ++i)
rmq.resize(N + 1);
_log2.resize(N + 1);
}
void setIndex(int index, int key)
{
rmq[0][index] = key;
}
void build()
{
for (int i = 1; (1 << i) <= N; ++i)
for (int j = 1; j + (1 << i) - 1 <= N; ++j)
{
int p = 1 << (i - 1);
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + p]);
}
_log2[1] = 0;
for (int i = 2; i <= N; ++i)
_log2[i] = _log2[i >> 1] + 1;
}
int query(int x, int y)
{
int dif = y - x + 1;
int k = _log2[dif];
return min(rmq[k][x] , rmq[k][y - (1 << k) + 1]);
}
};
int main()
{
ifstream in("rmq.in");
ofstream out("rmq.out");
int N, Q;
in >> N >> Q;
RangeMinimumQuery rmq(N);
for (int i = 1; i <= N; ++i)
{
int x;
in >> x;
rmq.setIndex(i, x);
}
rmq.build();
while (Q--)
{
int x, y;
in >> x >> y;
out << rmq.query(x, y) << "\n";
}
return 0;
}