Pagini recente » Cod sursa (job #2414397) | Cod sursa (job #2268837) | Cod sursa (job #1635888) | Cod sursa (job #2891495) | Cod sursa (job #2174497)
#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;
while (m--)
{
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;
}