using
System;
using
System.Collections.Generic;
class
GFG {
static
void
Swap(
int
x,
int
y,
int
[] p,
int
[] posOfCurrNum)
{
int
t1 = posOfCurrNum[p[x]];
posOfCurrNum[p[x]] = posOfCurrNum[p[y]];
posOfCurrNum[p[y]] = t1;
int
t2 = p[x];
p[x] = p[y];
p[y] = t2;
}
static
void
sortArray(
int
[] p,
int
n)
{
int
[] posOfCurrNum =
new
int
[n + 1];
for
(
int
i = 1; i <= n; i++) {
posOfCurrNum[p[i]] = i;
}
List<Tuple<
int
,
int
>> ans =
new
List<Tuple<
int
,
int
>>();
for
(
int
i = 1; i <= n; i++) {
if
(p[i] == i) {
continue
;
}
int
j = posOfCurrNum[i];
if
(Math.Abs(i - j) * 2 >= n) {
Swap(i, j, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, j));
}
else
if
(n / 2 <= i - 1) {
Swap(1, i, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, 1));
Swap(1, j, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(1, j));
Swap(i, 1, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, 1));
}
else
if
(n - j >= n / 2) {
Swap(i, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, n));
Swap(j, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(j, n));
Swap(i, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, n));
}
else
{
Swap(i, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, n));
Swap(n, 1, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(n, 1));
Swap(1, j, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(1, 4));
Swap(1, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(1, 6));
Swap(i, n, p, posOfCurrNum);
ans.Add(
new
Tuple<
int
,
int
>(i, n));
}
}
Console.WriteLine(ans.Count);
foreach
(Tuple<
int
,
int
> pp
in
ans)
Console.WriteLine(pp.Item1+
" "
+pp.Item2);
}
static
void
Main()
{
int
n = 6;
int
[] p = { 0, 2, 5, 3, 1, 4, 6 };
sortArray(p, n);
}
}