Pagini recente » Cod sursa (job #2362240) | Cod sursa (job #2885541) | Cod sursa (job #1585661) | Cod sursa (job #2056225) | Cod sursa (job #2504506)
#include <bits/stdc++.h>
#define Nmax 100005
#define Lmax 20
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, q, rmq[Nmax][Lmax], v[Nmax], pow2[Lmax], nr2;
void read()
{
f >> n >> q;
for (int i = 1; i <= n; ++i) {
f >> v[i];
}
}
void constructRmq()
{
for (int i = 1; i <= n; ++i)
rmq[i][0] = i;
for (int j = 1; 1 << j <= n; ++j) {
for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
if (v[rmq[i][j - 1]] < v[rmq[i + (1 << (j - 1))][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
}
}
}
int ask(int ls, int rs)
{
int k = floor(log2(rs - ls));
return min(v[rmq[ls][k]], v[rmq[rs - (1 << k) + 1][k]]);
}
void solve()
{
int x, y;
for (int i = 1; i <= q; ++i) {
f >> x >> y;
g << ask(x, y) << "\n";
}
}
int main()
{
read();
constructRmq();
solve();
return 0;
}