Petya 在他自己开发的编程语言 Tse 中为动态内存分配编写了一个堆(heap)。以下是它的工作原理。
一个正确的堆是一个由 $N$ 个单元组成的连续内存段。每个单元包含一个 32 位无符号整数,其值可以为 $0$ 到 $4\,294\,967\,295$(含)之间的任意值。堆被划分为 $B$ 个称为“块”(block)的子段。每个内存单元严格属于一个块。
每个块由两个或更多单元组成。一个块的第一和最后一个单元包含该块的有效大小(effective size),即该块中排除第一和最后一个单元后的单元数量。该块的其余单元可以包含任意 data,无论该块是空闲的还是被占用的。
Tse 是一种非常低级的语言,其用户经常会因为不小心将数据写入错误的单元而搞砸一切并损坏堆。用户要求 Petya 开发一个在此类事件后恢复堆完整性的功能。恢复代码必须分析堆所在内存段的 $N$ 个单元的内容,并修改若干个内存单元的内容,使得该内存段成为一个正确的堆。修改的单元数量必须最少。
交互
内存单元的数量可能非常大,你的程序将无法读取整个内存段。因此,这是一个交互式任务。你将与一个名为 interactor 的特殊程序进行交互,而不是进行文件输入输出。与该程序的交互通过标准输入输出流进行。
在开始时,你的程序会在标准输入流中接收一个整数 $N$,表示被分析段中的内存单元数量($2 \le N \le 2^{32}$)。接下来,你的程序可以进行查询以获取各个内存单元的内容。要进行查询,请向标准输出流打印单词 read,后跟一个空格分隔的整数 $A$,表示单元的地址/索引($0 \le A < N$)。作为响应,标准输入流中将发送一个整数 $V$,表示存储在第 $A$ 个内存单元中的值($0 \le V < 2^{32}$)。
最终,你的程序必须打印问题的答案,而不是另一个查询。在答案的第一行,打印单词 fix,后跟一个空格分隔的整数 $K$,表示必须修改的单元数量($K \ge 0$)。在接下来的 $K$ 行中,每行打印一个建议的修改。对于每个修改,打印两个整数:$A$ 表示必须修改的单元的地址/索引,$V$ 表示写入该单元的新值($0 \le A < N$,$0 \le V < 2^{32}$)。
保证存在一个最优解,其对应的堆包含不超过 $25\,000$ 个块。你的程序最多允许进行 $120\,000$ 次查询,否则将获得 Wrong Answer。
请确保在每次打印查询后打印换行符并清空输出流缓冲区(使用语言的 flush 命令)。否则,程序可能会超时(Timeout)。所有数字均以文本格式的十进制形式写入。
样例
输入格式 1
11 2 170 187 204 0 221 3 171 172 173 3
输出格式 1
read 0 read 1 read 2 read 3 read 4 read 5 read 6 read 7 read 8 read 9 read 10 fix 2 3 2 5 0
说明
该样例完全重复了另一个问题“Fix the heap 8-bit”的第二个样例:内存单元的内容和建议的恢复修改都是相同的。图示如下:
图示