对区间 [0,N-1] 支持两种操作:
1. update(L, R, v) 将区间[L,R] 的所有值设置为 v;
2. query(L, R) 查询区间 [L, R] 的最大值、最小值、区间和;
利用线段树解决该问题,更新时,对某区间的设置操作不需要分解到其每一个子区间(否则可能要更新每一个叶子节点),只需在该区间上做设置标记;在查询时,遇到有标记的区间,将标记 pushdown 到子区间;
// 用线段树实现动态区间最小值、最大值、区间和查询,对区间A[0..N-1]支持更新操作和查询操作:
// update(int L, int R, int v) 将区间[L,R]所有元素值设置为v
// query(int L, int R ) 查询数组区间[L,R]的最小值、最大值、区间和
public class RangeTree4RangeUpdate {
public static class Result {
public int minv;
public int maxv;
public int sumv;
}
//N为源数组总长度,可查询区间为[0,N)
int N = 0;
//M为最底层叶子节点数目,M = min { x | x = 2^k && x >= N }
int M = 0;
//线段树的数组表示
int[] setv = null; //各结点的设置标记
int[] sumv = null; //各结点的区间和
int[] minv = null; //各结点的最小值
int[] maxv = null; //各结点的最大值
public RangeTree4RangeUpdate(int[] A) {
build(