/*
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;
}