题目链接:https://www.luogu.org/problem/P1816
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[10000050][32],A[1000005],ans[1000005];
void ST()
{
for(int i=1; i<=n; i++)
dp[i][0]=A[i];
for(int j=1; (1<<j)<=n; j++)
{
for(int i=1; i<=n; i++)
{
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ(int l,int r)
{
int k=0;
while(1<<(k+1)<=r-l+1) k++;
return min(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&A[i]);
ST();
int l,r;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
ans[i]=RMQ(l,r);
}
for(int i=1;i<=m;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
}
/*
10 3
1 5 6 4 8 1 2 3 7 1
1 10
2 5
4 8
*/