func_code_string: #include <bits/stdc++.h>   using namespace std;   int num[400005];   int tot = 0;   set<int> st;   int mp[20];   int freq[20];   long long push[20][20];   long long addp[20][1048576];   vector<int> pos[20];   long long sum[20];   int cnt[20];   long long memo[1048576];   long long cost(int mask, int ofst, int id) {     return sum[id] + addp[id][mask] -            1LL * (ofst + 1 + ofst + cnt[id]) * cnt[id] / 2;     ;   }   long long dp(int i, int mask, int ofst) {     if (i == tot) return 0;     if (memo[mask] != -1) return memo[mask];     long long mn = 1000000000000000000;     int id;     for (int j = (0); j <= (tot - 1); j++) {       if ((mask >> j) & 1) continue;       long long v =           dp(i + 1, mask | (1 << j), ofst + cnt[j]) + cost(mask, ofst, j);       if (v < mn) {         mn = v;         id = j;       }     }     return memo[mask] = mn;   }   int main() {     int n;     scanf( %d , &n);     for (int i = (1); i <= (n); i++) {       scanf( %d , &num[i]);       --num[i];       st.insert(num[i]);     }     for (auto u : st) {       mp[u] = tot++;     }     for (int i = (0); i <= (tot - 1); i++) pos[i].push_back(0);     for (int i = (1); i <= (n); i++) {       num[i] = mp[num[i]];       int t = num[i];       pos[t].push_back(i);       cnt[t]++;       sum[t] += i;     }     memset(push, 0, sizeof(push));     for (int i = (1); i <= (n); i++) {       freq[num[i]]++;       for (int j = (0); j <= (tot - 1); j++) {         push[num[i]][j] += cnt[j] - freq[j];       }     }     memset(addp, 0, sizeof(addp));     for (int i = (0); i <= (tot - 1); i++) {       for (int j = (0); j <= ((1 << tot) - 1); j++) {         if ((j >> i) & 1) continue;         for (int k = (0); k <= (tot - 1); k++) {           if (~(j >> k) & 1) continue;           addp[i][j] += push[i][k];         }       }     }     memset(memo, -1, sizeof(memo));     printf( %lld n , dp(0, 0, 0));     return 0;   }   