设第i个数上一次出现的位置为lst[i],下一次出现的位置为nxt[i],那么第i个数可以用作更新答案的条件就是lst[i]r&&l<=i<=r
把lst,nxt和i分别看作三维坐标,问题就转化为了立方体求最大值
对于二维情况,我们可以用二维线段树搞,现在是三维,但是我们发现lst这一维在查询的时候左端点一直为0(我觉得用接地这个词语来形容特别形象-_-),所以我们可以通过可持久化来维护第一维,由于外层进行了可持久化,需要有将内层元素更新并保留原版本的操作,所以内层也要跟着可持久化
具体点说就是用主席树套主席树,每个版本都是一个二维线段树,第i个版本代表lst<=i的二维线段树的总和(前缀和),然后在修改的时候由于之前版本的二维线段树需要保留原来版本的信息,所以内层线段树也要用主席树
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include