ST算法适用范围:静态求区间最值
优点:简洁易写,速度、内存消耗优于线段树
缺点:适用范围小,无法更改区间值
注:
a[]:原数组

log1[]:log1[i]表示log₂ i向下取整,则log1[i]=log1[i/2]+1

f[i][j]:从a[i]到a[i+2^j-1]这个范围内的最值

先求出整个区间的值:

void build() 
{
    for (int i=1;i<=n;i++) f[i][0]=a[i];
    for (int i=2;i<=n;i++) log1[i]=log1[i/2]+1;//注意是从2开始 
    for (int j=1;j<=20;j++) //注意j<=20 
      for (int i=1;i+(1<<j)-1<=n;i++) //不要越界 
        f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); //最小值
// f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); //最大值 
}

查询:

int search(int l,int r) //查询l~r区间的最值 
{
    int s=log1[r-l+1];
    return min(f[l][s],f[r-(1<<s)+1][s]); //最小值
// return max(f[l][s],f[r-(1<<s)+1][s]); //最大值 
}