前置知识: 一种期望线性的静态区间查询
保持上文中的假设,在处理块内查询时,我们考虑在块上递归地建成上文中的结构。
由于每块的块长是原长的 \(\Theta\left(\sqrt{n}\right)\),递归深度不会超过 \(\Theta(\log\log n)\)。因此预处理的时空间复杂度均为 \(\Theta(n\log \log n)\) 的。
同理,单次查询时的复杂度是最劣 \(\Theta(\log\log n)\) 的(但是显然,在询问随机的情况下,期望复杂度仍为 \(O(1)\))。
如果你追求更快的查询,可以考虑类似倍增求 LCA 的方法,做到单次 \(O(\log\log\log n)\)。
更进一步地,可以使用类似猫树地处理手段,将长度补齐到 \(2^k\),显然这最多使长度翻倍,因此长度仍是 \(\Theta(n)\) 的。此时我们可以使用位运算和一些内置函数加快查询,做到最劣单次 \(\Theta(1)\)。
我们继续这种思路,考虑如何支持修改,考虑不再暴力预处理整块间的查询,而是将上文中结构建在整块查询上,这样我们就得到一个 \(O\left(\sqrt{n}\right)\) 单次修改的算法。