当求RMQ问题时可以用ST算法,预处理时间为O(nlogn),但查询时间为O(1).
另d[[i][j]表示从i开始长度为2^j的一段元素的最小值,那么d[i][j] = min(d[i][j-1], d[i+(1<<(j-1)][j-1]).
void Init(){
for(int i = 0; i < n; i++)
d[i][0] = a[i];
for(int j = 1; (1<<j) <= n; j++)
for(int i = 0; i+(1<<j) <= n; i++)
d[i][j] = min(d[i][j-1], d[i+(1<<(j-1))][j-1]);
}
int RMQ(int l, int r){
int k = 0;
while((1<<k) <= r-l+1)k++;
k--;
return min(d[l][k], d[r-(1<<k)+1][k]);
}