docs/misc/rollback-mo-algo.md
author: StudyingFather, Backl1ght, countercurrent-time, Ir1d, greyqz, MicDZ, ouuan, YOYO-UIAT
有些题目在区间转移时,可能会出现增加或者删除无法实现的问题.在只有增加不可实现或者只有删除不可实现的时候,就可以使用回滚莫队在 $O(n \sqrt m)$ 的时间内解决问题.回滚莫队的核心思想就是:既然只能实现一个操作,那么就只使用一个操作,剩下的交给回滚解决.
回滚莫队分为只使用增加操作的回滚莫队和只使用删除操作的回滚莫队.以下仅介绍只使用增加操作的回滚莫队,只使用删除操作的回滚莫队和只使用增加操作的回滚莫队只在算法实现上有一点区别,故不再赘述.
给你一个长度为 $n$ 的数组 $A$ 和 $m$ 个询问 $(1 \leq n, m \leq 10^5)$,每次询问一个区间 $[L, R]$ 内重要度最大的数字,要求 输出其重要度.一个数字 $i$ 重要度的定义为 $i$ 乘上 $i$ 在区间内出现的次数.
在这个问题中,在增加的过程中更新答案是很好实现的,但是在删除的过程中更新答案是不好实现的.因为如果增加会影响答案,那么新答案必定是刚刚增加的数字的重要度,而如果删除过后区间重要度最大的数字改变,我们很难确定新的重要度最大的数字是哪一个.所以,普通的莫队很难解决这个问题.
假设回滚莫队的分块大小是 $b$:
??? note "参考代码"
cpp --8<-- "docs/misc/code/rollback-mo-algo/rollback-mo-algo_1.cpp"