#include <bits/stdc++.h>
using namespace std;
const int maxn = 1 << 21;
const long long INF = 0x3f3f3f3f3f3f3f3f;
vector<int> pos[25];
long long dp[maxn];
long long cost[25][25];
int main(void) {
  int tot = 1 << 20;
  int i, j, k, n, v;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &v);
    v--;
    pos[v].push_back(i);
  }
  memset(cost, 0, sizeof(cost));
  for (i = 1; i < tot; i++) dp[i] = INF;
  dp[0] = 0;
  for (i = 0; i < 20; i++) {
    for (j = 0; j < 20; j++) {
      if (i == j) continue;
      if (pos[i].size() == 0 || pos[j].size() == 0) continue;
      int l, r;
      l = r = 0;
      while (l < pos[i].size()) {
        while (r < pos[j].size() && pos[i][l] > pos[j][r]) r++;
        cost[i][j] += r;
        l++;
      }
    }
  }
  for (i = 0; i < tot; i++) {
    vector<int> in;
    vector<int> out;
    in.clear();
    out.clear();
    for (j = 0; j < 20; j++) {
      if (i & (1 << j))
        in.push_back(j);
      else
        out.push_back(j);
    }
    for (j = 0; j < out.size(); j++) {
      int p, q;
      long long sum = 0;
      p = out[j];
      for (k = 0; k < in.size(); k++) {
        q = in[k];
        sum += cost[q][p];
      }
      dp[i | (1 << p)] = min(dp[i | (1 << p)], dp[i] + sum);
    }
  }
  printf("%I64d\n", dp[tot - 1]);
}
