「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=si−1a_i = s_{i - 1}。若存在,输出任意一个满足条件的 ii。

数据范围:1≤n,Q≤2×1051 \leq n, Q \leq 2\times 10^5,0≤ai≤1090 \leq a_i \leq 10^9,1≤p≤n1 \leq p \leq n,0≤x≤1090 \leq x \leq 10^9。

时空限制:33s / 256256MiB。

Solution

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

进一步,考虑 ai≥si−1a_i \geq s_{i - 1} 即 si≥2si−1s_i \geq 2s_{i - 1}。满足该要求的位置个数也是 O(log⁡a)\mathcal{O}(\log a) 级别的。

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

时间复杂度 O(nlog⁡nlog⁡a)\mathcal{O}(n \log n \log a)。