#include <bits/stdc++.h>
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimization("unroll-loops")
using namespace std;
using int64 = long long;
const int N = 4e5 + 5, M = 20;
int ar[N];
int cb[M];
int64 cost[M][M];
int64 dp[1 << M];
bool visited[1 << M];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  for (int i = 0; i < (1 << 20); ++i) {
    dp[i] = -1;
  }
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    int x;
    cin >> x;
    x--;
    ar[i] = x;
    for (int j = 0; j < M; ++j) {
      cost[x][j] += cb[j];
    }
    cb[x]++;
  }
  deque<int> dq{0};
  visited[0] = true;
  dp[0] = 0;
  while (not dq.empty()) {
    int i = dq.front();
    dq.pop_front();
    for (int d = 0; d < M; ++d) {
      if ((i & (1 << d)) == 0) {
        int64 c = dp[i];
        int x = i | (1 << d);
        for (int d2 = 0; d2 < M; ++d2) {
          if ((x & (1 << d2)) == 0) {
            c += cost[d][d2];
          }
        }
        if (dp[x] == -1)
          dp[x] = c;
        else
          dp[x] = min(dp[x], c);
        if (not visited[x]) {
          visited[x] = true;
          dq.push_back(x);
        }
      }
    }
  }
  cout << dp[(1 << M) - 1];
}
