Pagini recente » Cod sursa (job #2138170) | Cod sursa (job #2913042) | Cod sursa (job #1573436) | Cod sursa (job #1685703) | Cod sursa (job #2404550)
#include <fstream>
#include <iostream>
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, a[nmax], rmq[nmax][22];
int lft, rgh;
int l2(int x)
{
if (x<=1) return 0;
int ans = 0, act = 1;
while (true)
{
if (act > x) return ans - 1;
act *= 2, ++ans;
}
}
int main()
{
fin>>n>>m;
for (int i=1;i<=n;++i)
fin>>a[i];
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 ( a[rmq[i][j-1]] < a[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];
}
}
}
for (int i=1;i<=m;++i)
{
fin>>lft>>rgh;
int d = rgh - lft + 1;
int p2 = l2(d);
int rm = d - (1<<p2);
if (a[rmq[lft][p2]] < a[rmq[lft+rm][p2]])
fout<<a[rmq[lft][p2]]<<'\n';
else
fout<<a[rmq[lft+rm][p2]]<<'\n';
}
return 0;
}