ST表模板
//ST表预处理O(nlogn),查询O(1),但不支持在线修改
//dp [ i, j ]表示[ i, i+2^j-1]这个区间内的最值
//把dp [i,j]平均分成两段(因为dp [ i,j ]一定是偶数个数字)。
//从 i 到i + 2 ^ (j - 1) - 1为一段,i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1))。
int dpMin[50005][20],dpMax[50005][20];
int a[50005];
int n,q;
void Init()
{
for(int i=1;i<=n;i++)
dpMin[i][0] = dpMax[i][0] = a[i];
for (int j=1;j<=log(n)/log(2);j++) //只能j在外,i在内
{
for(int i=1;i<=n;i++)
{
if (i+(1<<j)-1<=n)
{
dpMin[i][j]=min(dpMin[i][j-1],dpMin[i+(1<<(j-1))][j-1]);
dpMax[i][j]=max(dpMax[i][j-1],dpMax[i+(1<<(j-1))][j-1]);
}
else
break;
}
}
}
int ST_min(int l,int r)
{
int k=log(r-l+1)/log(2.0);
return min(dpMin[l][k],dpMin[r-(1<<k)+1][k]);
}
int ST_max(int l,int r)
{
int k=log(r-l+1)/log(2.0);
return max(dpMax[l][k],dpMax[r-(1<<k)+1][k]);
}
模板题:https://blog.youkuaiyun.com/baodream/article/details/80206556