#include <bits/stdc++.h>
using namespace std;
char buf[1000000], *p1 = buf, *p2 = buf;
inline char gc() {
  if (p1 == p2) p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin);
  return p1 == p2 ? EOF : *(p1++);
}
template <class T>
inline void read(T &n) {
  n = 0;
  register int ch = gc();
  while (ch < '0' || ch > '9') ch = gc();
  while (ch >= '0' && ch <= '9') n = n * 10 + (ch ^ 48), ch = gc();
}
int const MAXN = 1048585;
long long vis[MAXN], f[MAXN], T[21][400005], cnt[25][25];
int n, a[MAXN], tong[MAXN];
queue<int> q;
inline void Add(long long *t, int pos, int num) {
  while (pos <= n) t[pos] += num, pos += (pos & (-pos));
}
inline long long Que(long long *t, int pos) {
  long long re = 0;
  while (pos) re += t[pos], pos -= (pos & (-pos));
  return re;
}
int main() {
  read(n);
  for (register int i = 1; i <= n; ++i) {
    read(a[i]);
    for (register int j = 1; j <= 20; ++j)
      if (a[i] != j) cnt[a[i]][j] = cnt[a[i]][j] + Que(T[j], i);
    Add(T[a[i]], i, 1);
  }
  memset(f, 0x7f, sizeof(f));
  f[0] = 0;
  q.push(0);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    if (vis[t] > 1) {
      --vis[t];
      continue;
    }
    for (register int i = 1; i <= 20; ++i) {
      if (!((t >> (i - 1)) & 1)) {
        int tmp = t | (1 << (i - 1));
        long long ans = 0;
        for (register int j = 1; j <= 20; ++j)
          if (!((t >> (j - 1)) & 1)) ans += cnt[i][j];
        ans += f[t];
        if (ans < f[tmp]) f[tmp] = ans, q.push(tmp), ++vis[tmp];
      }
    }
  }
  cout << f[(1 << 20) - 1] << endl;
  return 0;
}
