CF2255E2 What Will Remain at the End? (Hard Version)
题目描述
这是该问题的 Hard 版本。两个版本唯一的区别在于初始数组和操作 $1$ 中 $x$ 的取值范围。在本版本中,这些值可以是 $[-10^9, 10^9]$ 区间内的任意整数。如果你要 hack,只能在两个版本都通过时才能进行。
在最后一次出击前,Chtholly 向 Willem 提出了三个问题。
第二个问题是:如果天空真的迎来终结,还会剩下什么?
Willem 无法直接回答她。于是他翻开了一本共有 $n$ 条记录的编年史,编号从 $1$ 到 $n$。每条记录保存一个整数:正值代表希望,负值代表绝望。
编年史的初始内容形成了数组 $a_1,a_2,\ldots,a_n$,称为第 $0$ 版。Chtholly 接着执行了 $q$ 次操作。对每个 $1\le i\le q$,第 $i$ 次操作基于版本 $i-1$ 生成第 $i$ 版。
每次操作有如下四种类型之一:
- $\texttt{1 l r x}$:将 $l\le k\le r$ 的所有 $a_k$ 赋值为 $x$。
- $\texttt{2 l r}$:将 $l\le k\le r$ 的所有 $a_k$ 取反,即 $a_k\gets -a_k$。
- $\texttt{3 l r}$:将 $l\le k\le r$ 的所有 $a_k$ 更新为 $a_k\gets\max(a_k,0)$。
- $\texttt{4 p}$:对于所有先前的版本 $0,1,\ldots,i-1$,取下标 $p$ 处的值,形成序列 $b_0,b_1,\ldots,b_{i-1}$。求该序列所有非空子段的最大和 $^\ast$。
如果是 $1,2,3$ 操作,则将版本 $i-1$ 上指定区间修改得到新版本 $i$。类型 $4$ 操作不会修改数组,因此版本 $i$ 与 $i-1$ 相同。
操作经过编码,且必须按顺序处理。解码依赖于 $\mathrm{lastans}$,而该值会在每次 $4$ 操作后更新。
请帮助 Willem 回答每个 $4$ 类型的操作。
$^\ast$ 若有一个数组 $b$,那么其子段 $c$ 是由 $b$ 连续若干元素组成的(可能删除开头若干元素、也可能删除结尾若干元素,可以一个都不删,也可以全删)。
输入格式
每份测试输入包含多个测试用例。第一行包含测试用例数 $t$($1\le t \le 10^4$)。每个用例的说明如下。
每个测试用例的第一行包含两个整数 $n$ 和 $q$($1\le n,q\le5\cdot10^5$),表示数组长度和操作数。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($-10^9\le a_i\le 10^9$),即第 $0$ 版的数组。
接下来 $q$ 行描述 $q$ 次操作,每行按如下某种格式给出(均为编码后的数据):
- $\texttt{1 u v x}$($0\le u,v < 2^{64}$,$-10^9\le x\le 10^9$);
- $\texttt{2 u v}$($0\le u,v < 2^{64}$);
- $\texttt{3 u v}$($0\le u,v < 2^{64}$);
- $\texttt{4 u}$($0\le u < 2^{64}$)。
上述所有操作均已编码,须按顺序解码,其解码依赖于变量 $\mathrm{lastans}$。
初始时,$\mathrm{lastans}=0$。每当你回答一个类型 $4$ 操作后,将答案对 $2^{64}$ 取模后的最小非负余数赋给 $\mathrm{lastans}$。其它类型操作不会影响 $\mathrm{lastans}$。
对于每个被编码的坐标 $y$,设
\[
d(y) = \left((y \oplus \mathrm{lastans}) \bmod n\right) + 1
\]
其中 $\oplus$ 表示[按位异或运算](https://en.wikipedia.org/wiki/Bitwise_operation#XOR)。
- 若操作为 $\texttt{1 u v x}$,则 $l=\min(d(u), d(v))$,$r=\max(d(u), d(v))$。$x$ 未编码。
- 若操作为 $\texttt{2 u v}$ 或 $\texttt{3 u v}$,则 $l=\min(d(u), d(v))$,$r=\max(d(u), d(v))$。
- 若操作为 $\texttt{4 u}$,则 $p=d(u)$。
操作类型未编码。请注意在每次 $4$ 操作后正确更新 $\mathrm{lastans}$。
保证所有测试用例中 $n$ 的总和不超过 $5\cdot10^5$。
保证所有测试用例中 $q$ 的总和不超过 $5\cdot10^5$。
输出格式
对于每个 $4$ 类型的操作,输出一行一个整数,表示经过该操作前,下标为 $p$ 的各历史版本值构成的序列的最大非空子段和。
说明/提示
在第一个用例中,第一次操作时 $\mathrm{lastans}=0$,因此被编码的坐标 $1$ 解码为第 $2$ 个位置。仅考虑第 $0$ 版,下标 $2$ 处的值为 $-3$,因此答案为 $-3$。
现在 $\mathrm{lastans}=2^{64}-3=18\,446\,744\,073\,709\,551\,613$。此时编码区间 $[18\,446\,744\,073\,709\,551\,613,18\,446\,744\,073\,709\,551\,615]$ 译码后为 $[1,3]$,编码坐标 $18\,446\,744\,073\,709\,551\,612$ 对应第 $2$ 个位置。
在第二次查询前,下标 $2$ 位置的所有历史版本($0$、$1$、$2$)的值为 $-3$、$-3$、$3$,其最大子段和为 $3$。
在第三次查询前,下标 $2$ 处各历史版本 $0,1,\ldots,5$ 的值为 $[-3,-3,3,3,3,-4]$,连续三个 $3$ 构成的子段和为 $9$。
注意第一次、第二次、第三次查询时分别生成了 $1,3,6$ 号版本,尽管这些查询并未更改数组。
在第二个用例中,第一次查询询问位置 $1$,因此答案为 $1$。之后 $\mathrm{lastans}=1$,编码操作 $\texttt{1 0 3 -1}$ 解码后为 $\texttt{1 2 3 -1}$。
在第二次查询前,下标 $3$ 处历史版本($0,1,2$)的值为 $3$、$3$、$-1$,最大子段和为 $6$。
随后 $\mathrm{lastans}=6$,编码操作 $\texttt{2 6 7}$ 和 $\texttt{3 7 4}$ 解码后分别变为 $\texttt{2 1 2}$ 和 $\texttt{3 2 3}$。在最后一次查询前,下标 $2$ 处历史版本 $0,1,\ldots,5$ 的值为 $[-2,-2,-1,-1,1,1]$,其最大非空子段和为 $2$。
由 ChatGPT 5 翻译