分块信仰。
注意到都有循环位移了肯定维护到连续段是吧。对操作分块,设块长为 B ,那么一个重要性质:一个操作块内会划分为 $O(B)$ 个等价段(因为每次操作之多增加三个)。于是维护到连续段即可。暴力模拟修改连续段即可 $O(B^2)$ 。
连续段内部:只要有任何一个块内有答案就可以直接跳了。线性扫描原数组维护块内前后缀 $\max/\min$ 即可 $O(n)$; 连续段内部对连续段:维护块内min/max,以及块内的顺序对的第一个数的max和第一个数的min。查询扫描所有块即可。复杂度 $O(n+B^2)$; 连续段对连续段对连续段:相当于求每个块内大于前面的块的min且小于后面的块的max的有几个。离线,块内树状数组即可(不要写在线,在线空间是 $O(nB)$,大数组访问很慢,离线的话树状数组不是 $O(nB)$ 的会好一点)。于是做到了 $O(B^2\log{n})$。压位树状数组+快速清空可以做到更小常数的 $O(B^2\log{\frac{n}{w}})$。当然也可以对原序列预处理每两个块的贡献,但是需要对每个块内离线桶排序,常数大,但是可以做到 $O(n+B^2)$。
于是就是 $O(n\sqrt{n})$ ,并且我的 $O(n\sqrt{n\log{\frac{n}{w}}})$ 的做法好像都跑的比大部分人的平衡树快(大概是因为预处理的部分空间几乎都是 $O(B)$ 所以完美落入L1跑的飞快)。