上次的RMQ问题用了Sparse-Table算法来解决,然而就和之前那个最大连续和问题类似,如果要动态的修改数组的话,那么如果还用Sparse-Table算法的话,那么每次修改都要话O(nlogn)的时间重新初始化一遍,显然不太划算。那么这里就用到了另一个数据结构——线段树了。
这里的线段树支持如下三个操作:
init(A[], length):用长度为length的数组A来建树。
query(L, R):查询min{A[L], A[L+1], ... , A[R]}。
update(p, v):修改线段树,使得A[p] = v。
其实线段树不只是能解决RMQ问题,像是动态的最大连续和等问题,都可以用线段树来解决。这里的线段树是用来解决RMQ问题的,稍加修改便可以用来解决其他问题。
线段树的结构就如下图所示了,其实就是把完整的区间不断二分下去,每个结点上存着对应区间所求的信息,这里所求的就是区间最小值:
由上面的结构可以发现,对于非叶子结点i&#x