Pagini recente » Cod sursa (job #1639132) | Cod sursa (job #1023418) | Monitorul de evaluare | Cod sursa (job #1245777) | Cod sursa (job #2457317)
#include <fstream>
#include <cmath>
#include <climits>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int dp[100001][18];
int v[100001];
int n,m,st,dr,k,log2n,dif,Min;
int log(int x)
{
int k=0;
while((1<<(k+1))<=x)
k++;
return k;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
dp[i][0]=i;
}
log2n=log(n)+1;
for(int j=1;j<=log2n;j++)
{
for(int i=1;i<=n;i++)
if(i+(1<<(j-1))<=n)
{
if(v[dp[i][j-1]]<v[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];
}
}
for(int i=1;i<=m;i++)
{
fin>>st>>dr;
k=log(dr-st+1);
if(v[dp[st][k]]<v[dp[dr-(1<<k)+1][k]])
fout<<v[dp[st][k]]<<'\n';
else
fout<<v[dp[dr-(1<<k)+1][k]]<<'\n';
}
return 0;
}