ST表用于处理区间最值问题,时间复杂度可以处理到O(nlogn),用mn[i][j]表示从j到j+2^i-1的最小值,长度为2^i。j到j+2^i-1的长度为2^i,那么一半的长度就等于2^(i-1),前半段的状态表示为mn[i-1][j],后半段的长度也为2^(i-1),后半段的状态表示为mn[i-1][j+2^(i-1)].
综上可得:
mn[i][j]=min(mn[i-1][j],mn[i-1][j+2^(i-1)].
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100100];
int d[100100][110];
int n,m;
void rmq(){
for(int i=1;i<=m;++i)
d[i][0]=a[i];
for(int j=1; (1<<j) <=m;++j)
for(int i=1; i+ (1<<j) -1<=m;++i)
d[i][j]=min(d[i][j-1],d[i+( 1<<(j-1) )][j-1]);
}
int findit(int l,int r){
int kk=0;
while( ( 1<<(kk+1) )<=r-l+1) kk++;
return min(d[l][kk],d[r-(1<<kk)+1][kk]);
}
int main(){
scanf("%d",&m);
for(int i=1;i<=m;++i)
scanf("%d",&a[i]);
rmq();
int qq,pp;
scanf("%d%d",&qq,&pp);
printf("%d",findit(qq,pp));
return 0;
}