void ST_Init()
{
for(int i = 1; i <= n; i ++) f[i][0] = a[i]; //f[i][j],当j为0时,区间长度2^j为0,则区间最大值就是区间的唯一元素a[i]
int k = log2(n); //使用math.h库的函数,计算i和j的取值范围
for(int j = 1; j <= k; j ++) //之前已经计算过区间长度为0的情况,这里区间长度由2^1 到 2^k
{
for(int i = 1; i <= n - (1 << j) + 1; i ++) //确定区间左端点,区间范围为[i, i + 2^j - 1],所以 i + 2^j - 1 <= n
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]); //状态转移方程
}
}
int ST_Query(int l, int r)
{
int k = log2(r - l + 1);
return max(f[l][k], f[r - (1 << k) + 1][k]);
}