对于按顺序处理的信息,我们真的只能一个个处理吗?答案是否定的。有个神奇的做法:按 B = \log_2 n 分块,预处理块内所有 2 ^ B 个集合的信息。对于每个询问,只要能快速求出落在该块内的所有点的集合,就可以给总复杂度除掉一个 \log_2 n。
结合上述两个技巧,我们得到如下做法:每次处理 B = \log_2 n 个元素。DP 求出 2 ^ B 个集合的信息。然后对于每一维限制,预处理值域的每个前缀的点的集合,用 B 位二进制数描述。最后依次处理所有询问即可。时间复杂度是 \mathcal{O}(\frac {(n + q + V) n}{\log n}),其中 V 是值域。