考虑对于所有的加法操作都是全局的,那么可以打上一个懒标记记录,这样时间复杂度为 O(1)O(1)

对于 popcount\operatorname{popcount},第一次操作的时候暴力修改,时间复杂度为 O(n)O(n)。接下来开一个桶,维护在 popcount\operatorname{popcount} 之后 logV\log V 个元素在 popcount\operatorname{popcount} 之后对应的值和真实的值。对于以后的修改,只需要遍历这 logV\log V 个桶修改其真实的值就可以了。

对于询问操作,在没有进行 popcount\operatorname{popcount} 的时候,直接返回真实值和懒标记的和。对于进行过 popcount\operatorname{popcount} 的数,考虑在桶中找出通过映射的值 aia_i 找出真实值。

对于区间加并非全局的情况,如果横跨整块那么处理与上面一样。对于散块的区间加,就有可能会破坏这个桶,那么考虑重新计算并且将整块标记为没有处理过 popcount\operatorname{popcount}