使用RMQ可以进行O(1)复杂度的查询
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[2000];
const int MAXN = 50010;
int dp[MAXN][20];
int mm[MAXN];
//初始化 RMQ, b 数组下标从 1 开始,从 0 开始简单修改
void initRMQ(int n,int b[]){
mm[0] = -1;
for(int i = 1; i <= n;i++){
mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];
dp[i][0] = b[i];
}
for(int j = 1; j <= mm[n];j++)
for(int i = 1;i + (1<<j) -1 <= n;i++)
dp[i][j] = min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int rmq(int x,int y)
{
int k=mm[y-x+1];
return min(dp[x][k],dp[y-(1<<k)+1][k]);
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
initRMQ(n,a);
while(q--)
{
int x,y;
cin>>x>>y;
cout<<rmq(x+1,y+1)<<endl;
}
}