#P4732. [BalticOI 2015] Editor

[BalticOI 2015] Editor

Description

Byteasar 是一名程序员,他正在开发一个革命性的文本编辑器。在这个编辑器中,有两种类型的操作:一种是允许在编辑器中编辑文本的操作,另一种是允许撤销先前执行的操作的操作。这个编辑器的一个创新功能是多级撤销操作。其工作原理如下。

我们说文本编辑操作是一个 0 级操作。一个 i 级的撤销操作(对于 i=1,2,i = 1, 2, \ldots)可以撤销最后一个未被撤销的、级别不超过 i1i-1 的操作。例如,一个 1 级的撤销操作只能撤销编辑操作,而一个 2 级的撤销操作可以撤销编辑操作以及 1 级的撤销操作(但不能撤销更高级别的撤销操作)。

更正式地说,已经执行的每个操作可以处于两种状态:活动或已撤销。设 XX 是其中一个操作。刚执行完操作 XX 后,它处于活动状态。如果 XX 是一个 i 级的撤销操作,我们找到最近的、处于活动状态的、级别不超过 i1i-1 的操作(记为 X1X_1),并将操作 X1X_1 的状态更改为已撤销。如果 X1X_1 也是一个撤销操作,我们必须将 X1X_1 撤销的操作(记为 X2X_2)的状态更改为活动。我们以相同的方式继续:每当一个撤销操作 XjX_j 的状态改变时,我们必须也改变 Xj+1X_{j+1} 的状态(当然,这可能导致进一步操作的状态改变)。

当达到一个编辑操作时,整个状态修改链结束。

为简单起见,编辑器中的当前文本内容将由一个称为编辑器状态的单一整数 ss 指定(初始为 00)。每个编辑操作指定它产生的编辑器状态。

编辑器状态取决于处于活动状态的最后一个编辑操作。帮助 Byteasar 编写一个程序来跟踪编辑器状态。

让我们看看这个功能的实际应用:下表显示了 Byteasar 执行的一些操作以及每次执行后的编辑器状态。符号 EsE_s 表示将编辑器状态更改为 ss 的编辑操作,而符号 UiU_i 表示 i 级的撤销操作。

Operation E1\mathrm{E}_1 E2\mathrm{E}_2 E5\mathrm{E}_5 U1\mathrm{U}_1 U3\mathrm{U}_3 E4\mathrm{E}_4 U2\mathrm{U}_2 U1\mathrm{U}_1 E1\mathrm{E}_1
Editor state 0 1 2 5 2 1 2 4 2 1 0 1

首先,Byteasar 执行了三个编辑操作。编辑器状态从 00 变为 11,然后变为 22,最后变为 55。接下来,他执行了两个 1 级的撤销操作,撤销了操作 E5E_5E2E_2(将它们的状态更改为已撤销)。因此,编辑器状态恢复为 11。接下来的 3 级撤销操作撤销了最后一个 U1U_1 操作(将其状态更改为已撤销),从而恢复了操作 E2E_2(将其状态改回活动)。结果,编辑器状态再次变为 22。操作 U2U_2 撤销了操作 E4E_4,操作 U1U_1 再次撤销了恢复的操作 E2E_2,最后一个操作 U1U_1 撤销了操作 E1E_1,最后的操作是 E1E_1

Input Format

输入的第一行包含一个正整数 nn,指定 Byteasar 执行的操作数。接下来的 nn 行包含操作的描述,每行一个整数 ai(nain,aieq0)a_i(-n \le a_i \le n, a_i eq 0)。如果 ai>0a_i > 0,则它指定一个将编辑器状态修改为 aia_i 的编辑操作。如果 ai<0a_i < 0,则它指定一个级别为 ai-a_i 的撤销操作。你可以假设对于每个撤销操作,都会有一些较低级别的活动状态的操作可以被撤销。

Output Format

你的程序应输出 nn 行。第 ii 行应包含一个整数,指定执行输入中的前 ii 个操作后的编辑器状态。

11
1
2
5
-1
-1
-3
4
-2
-1
-1
1
1
2
5
2
1
2
4
2
1
0
1

Hint

以下子任务和评测无关,仅供参考。

(但是我开不了 4 个 Subtask,所以就放在一起测了。)

题面翻译由 ChatGPT-4o 提供。