#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 0x3f3f3f3f;
const int maxn = 4e5 + 1;
const int mod = 1e9 + 7;
using pii = pair<int, int>;
int n;
int a[maxn], b[maxn], N;
ll dp[1 << 20];
ll f[20][20];
ll sum[20][maxn], cost[20][1 << 20];
vector<int> v[20];
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    b[i] = a[i];
  }
  sort(b + 1, b + n + 1);
  N = unique(b + 1, b + n + 1) - (b + 1);
  for (int i = 1; i <= n; i++) {
    a[i] = lower_bound(b + 1, b + N + 1, a[i]) - b - 1;
    sum[a[i]][i]++;
    v[a[i]].push_back(i);
  }
  for (int i = 0; i <= N - 1; i++)
    for (int j = 1; j <= n; j++) sum[i][j] += sum[i][j - 1];
  for (int i = 0; i <= N - 1; i++)
    for (auto x : v[i])
      for (int j = 0; j <= N - 1; j++) {
        if (i != j) f[i][j] += sum[j][x];
      }
  for (int s = 1; s < (1 << N); s++) {
    int d = s - (s & (-s));
    int k = __builtin_ctz(s & (-s));
    for (int i = 0; i < N; i++) cost[i][s] = cost[i][d] + f[i][k];
  }
  memset(dp, 0x3f, sizeof dp);
  dp[0] = 0;
  int r = (1 << N) - 1;
  for (int s = 0; s <= r; s++) {
    for (int i = 0; i < N; i++) {
      if ((1 << i) & s) continue;
      dp[s | (1 << i)] = min(dp[s | (1 << i)], dp[s] + cost[i][r ^ s]);
    }
  }
  cout << dp[r] << "\n";
  return 0;
}
