Pagini recente » Cod sursa (job #1876572) | Cod sursa (job #2568313) | Cod sursa (job #565743) | Cod sursa (job #2055562) | Cod sursa (job #2136645)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,value[nmax],loga[nmax],logamx,dp[nmax][20];
void read()
{
f>>n>>m;
for (int i=1; i<=n; ++i)
f>>value[i];
}
void logarithmms()
{
for (int i=2; i<=n; ++i)
loga[i]=loga[i>>1]+1;
int power=0;
for (int i=1; i<=n; i<<=1,++power);
logamx=power-1;
}
void solve()
{
for (int i=1;i<=n;++i)
dp[i][0]=i;
for (int j=1;j<=logamx;++j)
for (int i=1;i+(1<<j)-1<=n;++i)
if (value[dp[i][j-1]]<value[dp[i+(1<<(j-1))][j-1]])
dp[i][j]=dp[i][j-1];
else
dp[i][j]=dp[i+(1<<(j-1))][j-1];
}
void query()
{
int e1,e2;
for (int i=1;i<=m;++i)
{f>>e1>>e2;
if (e1>e2)
swap(e1,e2);
int loggy=loga[e2-e1+1];
g<<min(value[dp[e1][loggy]],value[dp[e2-(1<<loggy)+1][loggy]])<<'\n';
}}
int main()
{
read();
logarithmms();
solve();
query();
return 0;
}