Pagini recente » Cod sursa (job #1486204) | Cod sursa (job #539558) | Cod sursa (job #817786) | Cod sursa (job #738242) | Cod sursa (job #1914034)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f{ "rmq.in" };
ofstream q{ "rmq.out" };
#define LGMAX 20
#define NMAX 100005
int lg[NMAX];
int rmq[LGMAX][NMAX];
int v[NMAX];
int n, m;
void read()
{
f >> n >> m;
for (int i = 1; i <= n; ++i) f >> v[i];
}
void preProcess()
{
lg[1] = 0;
rmq[0][1] = v[1];
for(int i = 2; i <= n; ++i)
{
lg[i] = lg[i >> 1] + 1;
rmq[0][i] = v[i];
}
for(int i = 1; i < LGMAX; ++i)
{
for(int j = 1; j <= n; ++j)
{
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}
}
}
int query(int st, int dr)
{
int elems = dr - st + 1;
int lgdif = lg[elems];
return min(rmq[lgdif][st], rmq[lgdif][st + (elems - (1 << lgdif))]);
}
void solve()
{
int st, dr;
while(m--)
{
f >> st >> dr;
q << query(st, dr) << "\n";
}
}
int main()
{
read();
preProcess();
solve();
f.close();
q.close();
return 0;
}