Byteasar 是一名程序员,他正在开发一款革命性的文本编辑器。该编辑器有两种操作:一种用于编辑文本,另一种用于撤销之前执行的操作。该编辑器的一项创新功能是多级撤销操作。其工作原理如下:
我们将文本编辑操作称为 0 级操作。$i$ 级撤销操作($i = 1, 2, \dots$)会撤销最近执行的且尚未被撤销的级别小于 $i$ 的操作。例如,1 级撤销操作只能撤销编辑操作,而 2 级撤销操作既可以撤销编辑操作,也可以撤销 1 级撤销操作(但不能撤销更高级别的撤销操作)。
更正式地说,每个已执行的操作都处于两种状态之一:激活(active)或撤销(undone)。设 $X$ 为其中一个操作。在执行操作 $X$ 后,它处于激活状态。如果 $X$ 是一个 $i$ 级撤销操作,我们找到最近的处于激活状态且级别小于 $i$ 的操作(记为 $X_1$),并将 $X_1$ 的状态更改为撤销。如果 $X_1$ 也是一个撤销操作,我们必须将 $X_1$ 原本撤销的操作(设为 $X_2$)的状态更改为激活。我们以同样的方式继续:每当一个之前撤销了某个操作 $X_{j+1}$ 的撤销操作 $X_j$ 的状态发生改变时,我们也必须改变 $X_{j+1}$ 的状态(这当然可能导致后续操作的状态发生改变)。整个状态修改链在到达一个编辑操作时结束。
为简单起见,编辑器中当前的文本内容由一个整数 $s$ 指定,称为编辑器状态(初始为 0)。每个编辑操作都指定了它所产生的编辑器状态。编辑器状态取决于处于激活状态的最后一个编辑操作。请帮助 Byteasar 编写一个程序来跟踪编辑器状态。
让我们看看实际效果:下表显示了 Byteasar 执行的一些操作以及执行每个操作后的编辑器状态。符号 $E_s$ 表示将编辑器状态更改为 $s$ 的编辑操作,而符号 $U_i$ 表示 $i$ 级撤销操作。
| 操作 | $E_1$ | $E_2$ | $E_5$ | $U_1$ | $U_1$ | $U_3$ | $E_4$ | $U_2$ | $U_1$ | $U_1$ | $E_1$ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 编辑器状态 | 0 | 1 | 2 | 5 | 2 | 1 | 2 | 4 | 2 | 1 | 0 | 1 |
首先,Byteasar 执行了三个编辑操作。编辑器状态从 0 变为 1,然后变为 2,最后变为 5。接下来,他执行了两个 1 级撤销操作,撤销了操作 $E_5$ 和 $E_2$(将它们的状态更改为撤销)。因此,编辑器状态恢复为 1。随后的 3 级撤销操作撤销了最后一个操作 $U_1$(将其状态更改为撤销),从而恢复了操作 $E_2$(将其状态改回激活)。结果,编辑器状态再次变为 2。操作 $U_2$ 撤销了操作 $E_4$,操作 $U_1$ 再次撤销了已恢复的操作 $E_2$,最后一个操作 $U_1$ 撤销了操作 $E_1$,最终操作为 $E_1$。
输入格式
输入的第一行包含一个正整数 $n$,表示 Byteasar 执行的操作数量。接下来的 $n$ 行包含操作描述,每行一个整数 $a_i$($-n \le a_i \le n, a_i \neq 0$)。如果 $a_i > 0$,则表示一个将编辑器状态修改为 $a_i$ 的编辑操作。如果 $a_i < 0$,则表示一个级别为 $-a_i$ 的撤销操作。你可以假设对于每一个撤销操作,总会有某个级别更小的处于激活状态的操作可以被撤销。
输出格式
你的程序应输出 $n$ 行。第 $i$ 行应包含一个整数,表示执行输入中的前 $i$ 个操作后的编辑器状态。
样例
输入格式 1
11 1 2 5 -1 -1 -3 4 -2 -1 -1 1
输出格式 1
1 2 5 2 1 2 4 2 1 0 1
子任务
| 子任务 | 数据范围 | 分值 |
|---|---|---|
| 1 | $n \le 5000$ | 20 |
| 2 | $n \le 300\,000$ 且仅包含操作 $E_i$ 和 $U_1$ | 15 |
| 3 | $n \le 300\,000$ 且仅对序列中的最后一个数字进行评分(但前 $n-1$ 个数字必须是 $0$ 到 $n$ 之间的整数) | 28 |
| 4 | $n \le 300\,000$ | 37 |