#P8210. [THUPC 2022 初赛] 造计算机

[THUPC 2022 初赛] 造计算机

Description

小R和小C听说贵系有一门造计算机的课之后吓得连夜提交了退学申请。

开玩笑的啦!正处于大一的他们对这门课不但不害怕,甚至有些想笑。他们超强的动手能力甚至驱使他们想造一个玩意玩玩。

当然由于他们毕竟才大一,计算机专业课基本上都没上过,经过长时间的艰苦奋战,他们终于造出了一个奇怪的玩意:

这台计算机只有 nn 个内存单元,反而有足够多个寄存器。内存单元的编号从 11nn ,寄存器从 n+1n+1 开始往上编号。每个内存单元和寄存器可以存储一个整数。

目前他们已经设计好了一类指令:swap i, j,表示交换编号为 iijj 的单元里的数,其中 iijj 均为正整数且 iji \neq j 。他们打算写一段程序来测试这条指令。

最开始, nn 个内存单元中乱序存放着 1n1\thicksim n 这些数,且每个数恰好出现一次。而每个寄存器里存放的是它的编号。

两人打算设计一段指令序列,使得计算机依次执行完这些指令后,所有内存和寄存器中的数都归位,也就是恰好等于它自己的编号。

虽然没学过计算机专业课,小R和小C还是懂一点皮毛的,因此他们规定每条 swap 指令操作的两个位置至少有一个需要是寄存器,也就是 iijj 至少有一者应当大于 nn

然而,正当他们写完程序开始运行时,却发现系统崩溃了!在查找了半天原因后,他们发现了一个奇怪的 bug:他们设计出来的计算机不能运行两条相同的指令!也就是说,他们不能在一段程序里出现两条相同的 swap i, j 指令。更进一步他们发现即使出现一条 swap i, j 一条 swap j, i 也不行,因为计算机会自动将这两条指令视为同一条。

然后可怜的小R和小C就斯巴达了。不过他们在弃疗之前还是打算利用现有的架构把程序写出来。不仅如此,他们还希望用到的寄存器数量尽可能少。你能帮帮他们吗?

Input Format

第一行:一个正整数 n (1n105)n\ (1 \leq n \leq 10^5) 表示内存单元的数量。

第二行: nn 个正整数aia_i 依次表示第 ii 个内存单元中的初始值,保证所有 aia_i 构成一个 1n1 \thicksim n 的排列。

Output Format

第一行:两个非负整数 m,km,k,分别表示你用到的寄存器数量和指令的条数。

接下来 kk 行,每行输出两个正整数 i,ji, j,依次表示你设计的每一条指令中交换的两个位置。你需要保证 1i,jn+m1 \leq i,j \leq n+m,并且满足题目中对于指令的限制条件。

如果有多种设计指令的方案满足题目所需,输出任意一种即可。

你需要最小化 mm 而无需最小化 kk,但需要保证 k106k \leq 10^6。输入数据保证符合要求的解存在。

2
2 1
2 5
3 4
1 3
2 4
1 4
2 3

Hint

【样例解释】

最初,前 44 个单元的值依次为 (2,1,3,4)(2,1,3,4)

执行指令 swap 3, 4,各单元的值变为 (2,1,4,3)(2,1,4,3)

执行指令 swap 1, 3,各单元的值变为 (4,1,2,3)(4,1,2,3)

执行指令 swap 2, 4,各单元的值变为 (4,3,2,1)(4,3,2,1)

执行指令 swap 1, 4,各单元的值变为 (1,3,2,4)(1,3,2,4)

执行指令 swap 2, 3,各单元的值变为 (1,2,3,4)(1,2,3,4)

可以证明 m=1m=1 是不行的。