「CF992E」Nastya and King-Shamans

Description

Link:CF992E

给出一个长度为 nn 的数组 aa,记 si=j=1iajs_i = \sum_{j = 1}^i a_j

QQ 次操作,每次操作给出两个整数 p,xp, x,表示将 apa_p 赋成 xx。每次操作后,你都需要判断是否存在一个位置 ii 满足 ai=si1a_i = s_{i - 1}。若存在,输出任意一个满足条件的 ii

数据范围:1n,Q2×1051 \leq n, Q \leq 2\times 10^50ai1090 \leq a_i \leq 10^91pn1 \leq p \leq n0x1090 \leq x \leq 10^9

时空限制:33s / 256256MiB。

Solution

注意到 ai0a_i \geq 0。若 ai=si1a_i = s_{i - 1},则 si=2si1s_i = 2s_{i - 1}。故满足要求的位置个数是 O(loga)\mathcal{O}(\log a) 级别的。

进一步,考虑 aisi1a_i \geq s_{i - 1}si2si1s_i \geq 2s_{i - 1}。满足该要求的位置个数也是 O(loga)\mathcal{O}(\log a) 级别的。

使用线段树维护 aisi1a_i - s_{i - 1} 的最大值。每次暴力地遍历整棵线段树,遇到最大值 <0< 0 的区间就返回,遇到一个叶子就判断该点对应的 aisi1a_i - s_{i - 1} 是否等于 00

时间复杂度 O(nlognloga)\mathcal{O}(n \log n \log a)