题意转换后就是单点修改,区间询问前缀单调栈内位置之和。
用线段树维护,显然该信息无法快速从左右儿子处合并,考虑在处理左儿子对右儿子的影响。
形式化一下需要维护的信息:
$$sum_c=sum_l+f(r,min_l)$$
$f(c,x)$ 表示节点 $c$ 内值均小于 $x$ 的前缀单调栈内位置之和。
考虑快速求出 $f(c,x)$:
若 $min_l\ge x$,则 $f(c,x)=f(r,x)$。
否则,$f(c,x)=f(l,x)+f(r,min_l)$。但是注意到 $sum_c=sum_l+f(r,min_l)$,所以 $f(c,x)=f(l,x)+sum_c-sum_l$。
那么求 $f(c,x)$ 的时间复杂度就是 $O(\log n)$ 的了。
单点修改需要更新 $O(\log n)$ 个节点,时间复杂度 $O(\log^2 n)$。
区间询问就是将区间分解成 $O(\log n)$ 个节点,从左到右求 $f(c,x)$,更新 $x$,时间复杂度 $O(\log^2 n)$。