#include <bits/stdc++.h>
using namespace std;
void file(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
template <typename Tp>
void read(Tp &x) {
  long long fh = 1;
  char c = getchar();
  x = 0;
  while (c > '9' || c < '0') {
    if (c == '-') {
      fh = -1;
    }
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + (c & 15);
    c = getchar();
  }
  x *= fh;
}
struct Edge {
  long long f, t, w, nxt;
} edge[2000005];
long long head[1000005], etot = 1;
void add_edge(long long f, long long t, long long w = 0) {
  edge[++etot] = (Edge){f, t, w, head[f]};
  head[f] = etot;
}
long long n, m;
long long a[1000005], ta[1000005], tat;
void lsh() {
  for (long long i = 1; i <= n; i++) ta[++tat] = a[i];
  sort(ta + 1, ta + tat + 1);
  tat = unique(ta + 1, ta + tat + 1) - ta - 1;
  for (long long i = 1; i <= n; i++)
    a[i] = lower_bound(ta + 1, ta + tat + 1, a[i]) - ta - 1;
}
long long f[1 << 21];
long long LG[1 << 21];
long long cnt[21][21];
void preprocess() {
  vector<long long> v1, v2;
  for (long long i = 0; i < m; i++) {
    for (long long j = 0; j < m; j++) {
      if (i == j) continue;
      v1.clear();
      v2.clear();
      for (long long t = 1; t <= n; t++) {
        if (a[t] == i) v1.push_back(t);
        if (a[t] == j) v2.push_back(t);
      }
      for (long long p = 0, q = 0; p < v1.size() && q < v2.size(); q++) {
        while (p < v1.size() && v1[p] <= v2[q]) p++;
        cnt[i][j] += v1.size() - p;
      }
    }
  }
}
long long calc(long long S, long long cur) {
  long long ret = 0;
  for (long long u = S; u; u -= (u & (-u))) {
    long long ut = LG[u & (-u)];
    ret += cnt[ut][cur];
  }
  return ret;
}
signed main() {
  read(n);
  for (long long i = 1; i <= n; i++) read(a[i]);
  lsh();
  m = tat;
  preprocess();
  for (long long i = 0; i < m; i++) LG[1 << i] = i;
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  for (long long i = 1; i < (1 << m); i++) {
    for (long long j = i, t; j; j -= (j & (-j))) {
      t = LG[j & (-j)];
      f[i] = min(f[i], f[i ^ (1 << t)] + calc((i ^ (1 << t)), t));
    }
  }
  cout << f[(1 << m) - 1] << endl;
  fclose(stdin);
  fclose(stdout);
  return 0;
}
