P4732 [BalticOI 2015] Editor

题目描述

Byteasar 是一名程序员,他正在开发一个革命性的文本编辑器。在这个编辑器中,有两种类型的操作:一种是允许在编辑器中编辑文本的操作,另一种是允许撤销先前执行的操作的操作。这个编辑器的一个创新功能是多级撤销操作。其工作原理如下。 我们说文本编辑操作是一个 0 级操作。一个 i 级的撤销操作(对于 $i = 1, 2, \ldots$)可以撤销最后一个未被撤销的、级别不超过 $i-1$ 的操作。例如,一个 1 级的撤销操作只能撤销编辑操作,而一个 2 级的撤销操作可以撤销编辑操作以及 1 级的撤销操作(但不能撤销更高级别的撤销操作)。 更正式地说,已经执行的每个操作可以处于两种状态:活动或已撤销。设 $X$ 是其中一个操作。刚执行完操作 $X$ 后,它处于活动状态。如果 $X$ 是一个 i 级的撤销操作,我们找到最近的、处于活动状态的、级别不超过 $i-1$ 的操作(记为 $X_1$),并将操作 $X_1$ 的状态更改为已撤销。如果 $X_1$ 也是一个撤销操作,我们必须将 $X_1$ 撤销的操作(记为 $X_2$)的状态更改为活动。我们以相同的方式继续:每当一个撤销操作 $X_j$ 的状态改变时,我们必须也改变 $X_{j+1}$ 的状态(当然,这可能导致进一步操作的状态改变)。 当达到一个编辑操作时,整个状态修改链结束。 为简单起见,编辑器中的当前文本内容将由一个称为编辑器状态的单一整数 $s$ 指定(初始为 $0$)。每个编辑操作指定它产生的编辑器状态。 编辑器状态取决于处于活动状态的最后一个编辑操作。帮助 Byteasar 编写一个程序来跟踪编辑器状态。 让我们看看这个功能的实际应用:下表显示了 Byteasar 执行的一些操作以及每次执行后的编辑器状态。符号 $E_s$ 表示将编辑器状态更改为 $s$ 的编辑操作,而符号 $U_i$ 表示 i 级的撤销操作。 | Operation | | $\mathrm{E}_1$ | $\mathrm{E}_2$ | $\mathrm{E}_5$ | $\mathrm{U}_1$ | $\mathrm{U}_1$ | $\mathrm{U}_3$ | $\mathrm{E}_4$ | $\mathrm{U}_2$ | $\mathrm{U}_1$ | $\mathrm{U}_1$ | $\mathrm{E}_1$ | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | Editor state | 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 eq 0)$。如果 $a_i > 0$,则它指定一个将编辑器状态修改为 $a_i$ 的编辑操作。如果 $a_i < 0$,则它指定一个级别为 $-a_i$ 的撤销操作。你可以假设对于每个撤销操作,都会有一些较低级别的活动状态的操作可以被撤销。

输出格式

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

说明/提示

以下子任务和评测无关,仅供参考。 ![](https://cdn.luogu.com.cn/upload/image_hosting/zejidndn.png) (但是我开不了 4 个 Subtask,所以就放在一起测了。) 题面翻译由 ChatGPT-4o 提供。