Swap!Swap!Swap!Swap!Swap!
题号:NC231614
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

作为一个即将开始考研的废物点心,Murphy在退役之后已经着手准备了!

为了考上梦想的**枝江大学**,Murphy已经制定了未来的考研计划,他在每一张纸上都写下他第几天该做些什么,一共写下了n张纸(n是一个偶数),每一张纸都有一个编号i,编号表示第i天的计划,刚开始所有计划的编号都是升序的。Murphy觉得只要按照顺序完成写下的计划,就能成为一名Master

可是嗷子总想带着Murphy找准进厂时机,于是嗷子将Murphy的计划全部打乱,并且对Murphy说:Miu子啊,我们一起进厂吧。Murphy不想理会嗷子,只想快点整理好自己的考研计划开始预习...


嗷子看到Murphy心中如此坚定,于是便开始拷打他,如果Murphy能够满足嗷子的条件,Murphy便可以继续考研。


Murphy每次可以将两张考研计划进行交换,倘若每次交换的考研计划在当前计划序列中的**位置(注意是计划的当前位置,不是计划的编号)**,满足,则Murphy可以不付出任何代价;否则Murphy需要付出1的代价。

嗷子需要Murphy用最小的代价让他自己的考研计划的编号序列,恢复成为初始的样子,即恢复成升序。

输入描述:

第一行包含一个整数n,为Murphyn张考研计划。

第二行包含n个数,表示打乱后计划编号序列。a_i为打乱后在位置i的考研计划的编号,

输出描述:

第一行包含一个整数cost,表示将考研计划编号变为升序的最小花费。

第二行包换一个整数num,表示你需要进行交换的操作次数。

接下来num行包含两个整数l,r,表示交换位置为l,r的两个计划,即交换
示例1

输入

复制
6
5 6 4 2 1 3

输出

复制
0
10
1 5
2 6
1 4
1 6
2 6
1 4
3 6
6 1
4 1
6 1

说明

Hint:注意输入输出对时限的影响,建议用scanf和printf输入输出

对于样例1

第5天的计划在位置1,第6天的计划在位置2...第3天的计划在位置6。

交换位置为1和5的计划,计划序列变为1 6 4 2 5 3

交换位置为2和6的计划,计划序列变为1 3 4 2 5 6

交换位置为1和4的计划,计划序列变为2 3 4 1 5 6

交换位置为1和6的计划,计划序列变为6 3 4 1 5 2

交换位置为2和6的计划,计划序列变为6 2 4 1 5 3

交换位置为1和4的计划,计划序列变为1 2 4 6 5 3

...

此样例每一次交换都不需要符出代价。