Pagini recente » Cod sursa (job #542698) | Cod sursa (job #559917) | Cod sursa (job #426824) | Cod sursa (job #1322894) | Cod sursa (job #2158356)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 1e5 + 5;
const int PMAX = 17;
const int INF = 0x3f3f3f3f;
int n, m, l, r;
int a[NMAX];
int rmq[NMAX][22]; // n, log2(n) ... minimul pe intervalul [i, i + 2^j - 1]
void build()
{
for (int i = 1; i <= n; ++i)
rmq[i][0] = a[i];
for (int i = 1; i <= log2(n); ++i)
for (int j = 1; j + (1 << i) - 1 <= n; ++j)
rmq[j][i] = min(rmq[j][i - 1], rmq[j + (1 << (i - 1))][i - 1]);
}
int query(int l, int r)
{
int dif = r - l + 1;
int loga = (int)log2(dif);
return min(rmq[l][loga], rmq[r - (1 << loga) + 1][loga]);
}
void read()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> a[i];
}
int main()
{
read();
build();
while (m--)
{
fin >> l >> r;
fout << query(l, r) << '\n';
}
return 0;
}