/*
multiset <int> s;
int main()
{
s.insert(3);
s.insert(3);
s.erase(s.find(3));
multiset <int>::iterator it = s.find(3);
if (s.find(3) == s.end())
;
if (s.count(3) == 0)
;
for (multiset <int>::iterator it = s.begin(); it != s.end(); it++)
;
}
*/
// n, a[0..n-1]
// reverse(l, r)
#include <cstdio>
#include <cassert>
#include <set>
#include <unordered_set>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
typedef vector <int> vi;
queue <pair<vi, int> > q;
// 1. set <vi> s
// 2. set <long long> s
unordered_set <long long> s;
inline long long Hash( vi &v )
{
long long h = 0;
forn(i, v.size())
h = h * 239 + v[i];
return h;
}
inline void add( vi &v, int d )
{
//if (s.insert(v).second) // худший случай (log m) * n
if (s.insert(Hash(v)).second) // худший случай (log m) + n
q.push(make_pair(v, d));
}
bool sorted( vi &v )
{
forn(i, v.size())
if (v[i] != i + 1)
return 0;
return 1;
}
int main()
{
int n;
scanf("%d", &n);
vi v(n), t(n);
forn(i, n)
scanf("%d", &v[i]);
int d = -1;
add(v, 0);
while (1)
{
//puts("!");
assert(q.size());
d = q.front().second;
v = q.front().first;
//printf("d = %d, v = ", d);
//forn(i, n)
// printf("%d ", v[i]);
//puts("");
q.pop();
if (sorted(v))
break;
forn(r, n + 1) // r <= n
forn(l, r) // l < r, [l..r)
{
forn(i, n)
t[i] = v[i];
reverse(t.begin() + l, t.begin() + r);
add(t, d + 1);
}
}
printf("distance = %d\n", d);
return 0;
}