观察到 qqq ≤ 500500500 ,也就是说有效的行数不超过 500500500 行。
我们把行数离散化。
那么需要维护的数的数量最多只有 qqq ( mmm ? 111 ) +n+n+n 个
发现有 xix_ixi =1=1=1 ,也就是说,有效的格子只有第一行和最后一列。
我们把第一行和最后一列压到一起去,那么我们要对这个序列支持:
删除第 kkk 个元素
在末尾添加一个元素
这个操作能用平衡树实现,但是我用树状数组来实现。
用树状数组维护一个 010101 序列,第 iii 位上是 000 表示这个位置上的数已经被删除了或者还没有被插入,第 iii 位上是 111 表示这一位上的数没有被删除。
那么删除操作就是 111 → 000 ,插入操作就是 000 → 111 。
第 kkk 个元素就是前缀和为 kkk 的位置。
对于查找这个位置的操作,我使用树状数组二分
定义一行中原来的元素为初始时这一行前 mmm ? 111 个元素中,没有离队过的元素。
我们观察到对于本来就在这一行中的元素,我们可以直接算出它的值,而不用存储。
那么我们判断每一次询问是不是在本行的原来的元素中,如果是,直接判断掉。
那么每一行的“非原来的元素”有多少个呢?
我们不知道一行会有多少个,但是我们知道,所有行的这样的元素个数的总和不超过 qqq 个。
这启发了我们对于每一行,只对其“非原来的元素”开一个树状数组维护。
而对于“原来的元素”,我们直接离线预处理。
预处理时需要对所有的询问按照 xix_ixi 为第一关键字,询问编号为第二关键字排序。
再对最后一列单独处理。