####ST表用来求给定区间RMQ的最值
st[i][j] 表示以i开头i+2^j结尾的区间的最值。
初态:st[i][0] = a[i];
状态转移: st[i][j] = min/max (st[i][j-1], st[i+(1<<(j-1))][j-1]);
模板
const int maxn = 1005;
int stmin[maxn][20],stmax[maxn][20];
void InitSt()
{
for(int j=1; (1<<j) <n; j++)
{
for(int i=0; i+(1<<j)-1 < n; i++)
{
stmin[i][j] = min(stmin[i][j-1], stmin[i+(1<<(j-1))][j-1]);
//stmax[i][j] = max(stmax[i][j-1], stmax[i+(1<<(j-1))][j-1]);
}
}
}
int query(int l, int r)
{
int x = (int)(log( double(r-l+1)) / log(2.0));
return min(stmin[l][x], stmin[r-(1<<x)+1][x]); //找最大值改成max
}
练习题 : HDU OJ 3183