翻转排序
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

给定一个 n 的排列 p_1, p_2, \cdots, p_n,您需要对其进行不超过 2n 次区间翻转操作使得这个排列变为升序排列。具体来说,对于第 i 次区间翻转操作,您需要指定翻转的左右端点 l_ir_i,表示将排列的第 l_i 个元素到第 r_i 个元素(含两端)这段子序列颠倒顺序。如果有多种可行的方法,输出任意一种即可。
请回忆:一个 n 的排列是一个长度为 n 的序列,每个从 1n(含两端)的整数在其中都恰好出现一次。

输入描述:

第一行包含一个整数 n1 \le n \le 2 \times 10^5),表示排列的长度。
第二行包含 n 个互不相同的整数 p_1, p_2, \cdots, p_n1 \le p_i \le n),表示初始的排列。

输出描述:

第一行输出一个整数 m,表示进行的操作次数。您需要保证 0 \le m \le 2n
接下来 m 行,每行包含两个整数 l_ir_i,表示第 i 次区间翻转操作的两个端点。您需要保证 1 \le l_i \le r_i \le n
示例1

输入

复制
5
3 2 5 4 1

输出

复制
2
3 5
1 3