Pagini recente » Cod sursa (job #918426) | Cod sursa (job #883599) | Cod sursa (job #3243226) | Cod sursa (job #1796027) | Cod sursa (job #2174505)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
#define lggmax 18
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,val[nmax],dp[nmax][lggmax],lgn,logs[nmax];
void read()
{
f>>n>>m;
for (int i=1;i<=n;++i)
f>>val[i];
}
void precalclog()
{
for (int i=2;i<=n;++i)
logs[i]=logs[i>>1]+1;
int npow=0;
for (int i=1;i<=n;i<<=1,++npow);
lgn=npow-1;
}
void precalc()
{
for (int i=1;i<=n;++i)
dp[i][0]=i;
for (int j=1;j<=lgn;++j)
for (int i=1;i+(1<<j)-1<=n;++i)
if (val[dp[i][j-1]]<val[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 a,b;
for( int i=1;i<=m;++i)
{f>>a>>b;
if (a>b)
swap(a,b);
int locallog=logs[b-a+1];
g<<min(val[dp[a][locallog]],val[dp[b-(1<<locallog)+1][locallog]])<<'\n';
}
}
int main()
{
read();
precalclog();
precalc();
query();
return 0;
}