在计算理论中,停机问题是指根据任意计算机程序的描述,判断该程序是会运行结束(即停机)还是会永远运行下去的问题。
Alan Turing 在 1936 年证明了解决停机问题的通用算法是不存在的,但我们敬爱的算法科学家 DreamGrid 声称他刚刚在一种特定的编程语言——“梦语言”(Dream Language)中找到了停机问题的解法!
梦语言是一种仅包含 5 种指令的编程语言。所有这些指令都会读取或写入一个 8 位寄存器 $r$,其初始值设为 0。我们现在在下表中列出这 5 种指令。注意,我们将当前指令记为第 $i$ 条指令。
| 指令 | 描述 |
|---|---|
add v |
将 $v$ 加到寄存器 $r$ 中。由于 $r$ 是一个 8 位寄存器,该指令实际上计算 $(r + v) \pmod{256}$ 并将结果存入 $r$,即 $r \leftarrow (r + v) \pmod{256}$。之后,继续执行第 $(i + 1)$ 条指令。 |
beq v k |
如果 $r$ 的值等于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。 |
bne v k |
如果 $r$ 的值不等于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。 |
blt v k |
如果 $r$ 的值严格小于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。 |
bgt v k |
如果 $r$ 的值严格大于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。 |
一个包含 $n$ 条指令的梦语言程序总是从第 1 条指令开始执行,并且仅当程序试图执行第 $(n + 1)$ 条指令时才会停机(即停止执行)。
作为 DreamGrid 的助手,为了帮助他赢得图灵奖,请你编写一个程序来判断给定的梦语言程序是否最终会停机。
输入格式
输入包含多组测试数据。输入的第一行是一个整数 $T$,表示测试数据的组数。对于每组测试数据:
第一行包含一个整数 $n$ ($1 \le n \le 10^4$),表示接下来的梦语言程序中的指令条数。
接下来的 $n$ 行中,第 $i$ 行首先包含一个字符串 $s$ ($s \in \{\text{"add", "beq", "bne", "blt", "bgt"}\}$),表示程序中第 $i$ 条指令的类型。
- 如果 $s$ 为 "add",则后面跟一个整数 $v$ ($0 \le v \le 255$),表示加到寄存器中的值;
- 否则,后面跟两个整数 $v$ 和 $k$ ($0 \le v \le 255, 1 \le k \le n$),表示条件值和跳转的目标。
保证所有测试数据的 $n$ 之和不超过 $10^5$。
输出格式
对于每组测试数据,输出一行。如果程序最终会停机,输出 "Yes"(不含引号);如果程序会永远运行下去,输出 "No"(不含引号)。
样例
样例输入 1
4 2 add 1 blt 5 1 3 add 252 add 1 bgt 252 2 2 add 2 bne 7 1 3 add 1 bne 252 1 beq 252 1
样例输出 1
Yes Yes No No
说明
对于第二个样例测试数据,请注意 $r$ 是一个 8 位寄存器,因此在执行四次 "add 1" 指令后,$r$ 的值将从 252 变为 0,程序将会停机。
对于第三个样例测试数据,很容易发现 $r$ 的值将始终为偶数,因此 $r$ 的值不可能等于 7,程序将永远运行下去。