容易发现每次贪心选出最靠前的段是正确的。于是有如下暴力算法:维护一个变量 $x$ 表示当前还未匹配的数量,每次遇到一个新的长度为 $y$ 的连续段时:
- 若这一段是奇数编号的段,那么令 $x \gets x + y$,并从 $x$ 中取出尽可能多的完整的 $K$;
- 若这一段是偶数编号的段,那么令 $x \gets \max(0, x - y)$。
接下来考虑如何快速求出答案。对于当前位置 $p$,如果能找出下一个和 $0$ 取 $\max$ 生效的位置 $f_p$,那么就可以通过前缀和快速计算出这一阶段分出的段数。
令偶数位的长度标记为负数,并记 $s$ 为原序列的前缀和。注意到 $f_p$ 为第一个满足 $(s_{p' - 1} - s_{p - 1}) \bmod k < -a_{p'}$ 的位置 $p'$,所以只需要从后往前扫这个序列,并维护 $s_{p - 1} \bmod k = i$ 时的最小 $p'$,需要支持区间覆盖和单点查询,使用 ODT 维护即可。
求出 $f_p$ 后,只需要预处理倍增数组即可做到总时间复杂度 $\mathcal{O}((N + Q) \log N)$。