思路:
这是一道求区间最值的题。可以用ST表求解。ST表是数组st[i][j]代表从i开始,2 的 j次方个数里的最小值,这样我们就可以得到状态转移方程为st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int a[N];
int st[N][20];
int Log[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
st[i][0]=a[i];//从i到2的0次方(1)间的最小数是a[i]
}
for(int i=2;i<=n;i++){
Log[i]=Log[i/2]+1;
}
for(int j=1;j<=Log[n];j++){
for(int i=1;i+(1<<(j-1))<=n;i++){
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);//状态转移方程
//st[i][j]等于左边的最小值和右边最小值的最小值
}
}
int l,r;
for(int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
//cin>>l>>r;
int k=Log[r-l+1];//l到r中最大的2的次方是k。
printf("%d",min(st[l][k],st[r-(1<<k)+1][k]));
cout<<" ";
}
return 0;
}