零基索引的最大值线段树,区间采用左闭右开 [b, e) 约定,可通过修改 T、f、unit 定制为其他结合律运算;单次操作 O(log N)。

Description: Zero-indexed max-tree. Bounds are inclusive to the left and exclusive to the right. Can be changed by modifying T, f and unit. Time: O(\log N)

  • 定义与接口(据实现)

    • 结构体 Tree:
      • typedef T = int;static constexpr T unit = INT_MIN;
      • 结合函数 f(T a, T b) = max(a,b)(可替换为任意结合函数);
      • 内部数组 s(长度 2n)与底层大小 n。
    • 构造:Tree(int n = 0, T def = unit) 初始化两倍长度的底层存储为 def。
    • update(pos, val):点更新 a[pos] = val,并自底向上维护父节点值。
    • query(b, e):查询区间 [b, e) 的聚合结果(此处为最大值)。
  • 工作机制

    • 点更新:将叶节点位置平移到数组上半部(pos += n),赋值后不断上跳 pos/=2,用 f 维护父节点:s[pos] = f(s[2pos], s[2pos+1])。
    • 区间查询:[b+n, e+n) 双指针向上收缩:
      • 若 b 为右子,则先合并 s[b] 到左结果 ra,b++;
      • 若 e 为右边界,则先 —e 并将 s[e] 合并到右结果 rb;
      • 循环结束后返回 f(ra, rb)。
  • 可定制性

    • 将 T、unit 与 f 改为所需的幺元与结合函数(如求和/最小值/按位运算等),即可得到相应线段树。
    • 区间语义为左闭右开 [b, e),数组为 0 基索引。
  • 复杂度

    • update 与 query 均为 O(log N);空间 O(N)。

关联节点