Problem p02798 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
const ll MOD = 1e9 + 7;
const ll INF = 1e18;
vector<ll> A, B;
ll n;

ll cnt(vector<ll> P, ll x) {
  vector<pair<ll, ll>> odd, even, U(n);
  ll ret = 0;
  for (ll i = 0; i < n; i++) {
    // iが偶数番目でそのカードが表で終わると決めた or
    // iが奇数番目でそのカードが裏で終わると決めた
    // => ソートされると偶数番目で終わる
    // (奇数回動くと裏で終わるため)
    // 奇数番目で終わるときはその逆
    if (i % 2 == (x >> i) % 2)
      even.emplace_back(P[i], i);
    else
      odd.emplace_back(P[i], i);
  }
  // 偶数番目で終わるカードと奇数番目で終わるカードの枚数差が2枚以上はありえない．
  if (abs((int)even.size() - (int)odd.size()) > 1)
    return INF;
  // それぞれカードの値でソート
  sort(odd.begin(), odd.end(),
       [](const pair<ll, ll> &a, const pair<ll, ll> &b) {
         if (a.first == b.first)
           return a.second < b.second;
         return a.first < b.first;
       });
  sort(even.begin(), even.end(),
       [](const pair<ll, ll> &a, const pair<ll, ll> &b) {
         if (a.first == b.first)
           return a.second < b.second;
         return a.first < b.first;
       });
  // ソート後の数列を復元
  for (ll i = 0; i < n; i++) {
    if (i % 2 == 0)
      U[i] = even[i / 2];
    else
      U[i] = odd[i / 2];
  }
  // ここで昇順になっていない場合はアウト
  for (ll i = 0; i < n - 1; i++) {
    if (U[i].first > U[i + 1].first)
      return INF;
  }
  // もとの数列PからUになるためにどのくらい移動したか(転倒数)
  for (ll i = 0; i < n - 1; i++) {
    for (ll j = n - 1; j >= i + 1; j--) {
      if (U[j].second < U[j - 1].second) {
        swap(U[j], U[j - 1]);
        ret++;
      }
    }
  }
  return ret;
}

ll solve(ll x) {
  vector<ll> P(n);
  for (ll i = 0; i < n; i++) {
    if ((x >> i) % 2 == 0)
      P[i] = A[i];
    else
      P[i] = B[i];
  }
  return cnt(P, x);
}

int main() {
  ll m, i, j, k;
  cin >> n;
  A = vector<ll>(n);
  B = vector<ll>(n);
  for (i = 0; i < n; i++)
    cin >> A[i];
  for (i = 0; i < n; i++)
    cin >> B[i];
  ll ret = INF;
  for (i = 0; i < (1ll << n); i++) {
    ret = min(ret, solve(i));
  }
  if (ret == INF)
    ret = -1;
  cout << ret << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
const ll MOD = 1e9 + 7;
const ll INF = 1e18;
vector<ll> A, B;
ll n;

ll cnt(vector<ll> P, ll x) {
  vector<pair<ll, ll>> odd, even, U(n);
  ll ret = 0;
  for (ll i = 0; i < n; i++) {
    // iが偶数番目でそのカードが表で終わると決めた or
    // iが奇数番目でそのカードが裏で終わると決めた
    // => ソートされると偶数番目で終わる
    // (奇数回動くと裏で終わるため)
    // 奇数番目で終わるときはその逆
    if (i % 2 == (x >> i) % 2)
      even.emplace_back(P[i], i);
    else
      odd.emplace_back(P[i], i);
  }
  // 偶数番目で終わるカードと奇数番目で終わるカードの枚数差が2枚以上はありえない．
  if ((int)even.size() - (int)odd.size() > 1 ||
      (int)even.size() - (int)odd.size() < 0)
    return INF;
  // それぞれカードの値でソート
  sort(odd.begin(), odd.end(),
       [](const pair<ll, ll> &a, const pair<ll, ll> &b) {
         if (a.first == b.first)
           return a.second < b.second;
         return a.first < b.first;
       });
  sort(even.begin(), even.end(),
       [](const pair<ll, ll> &a, const pair<ll, ll> &b) {
         if (a.first == b.first)
           return a.second < b.second;
         return a.first < b.first;
       });
  // ソート後の数列を復元
  for (ll i = 0; i < n; i++) {
    if (i % 2 == 0)
      U[i] = even[i / 2];
    else
      U[i] = odd[i / 2];
  }
  // ここで昇順になっていない場合はアウト
  for (ll i = 0; i < n - 1; i++) {
    if (U[i].first > U[i + 1].first)
      return INF;
  }
  // もとの数列PからUになるためにどのくらい移動したか(転倒数)
  for (ll i = 0; i < n - 1; i++) {
    for (ll j = n - 1; j >= i + 1; j--) {
      if (U[j].second < U[j - 1].second) {
        swap(U[j], U[j - 1]);
        ret++;
      }
    }
  }
  return ret;
}

ll solve(ll x) {
  vector<ll> P(n);
  for (ll i = 0; i < n; i++) {
    if ((x >> i) % 2 == 0)
      P[i] = A[i];
    else
      P[i] = B[i];
  }
  return cnt(P, x);
}

int main() {
  ll m, i, j, k;
  cin >> n;
  A = vector<ll>(n);
  B = vector<ll>(n);
  for (i = 0; i < n; i++)
    cin >> A[i];
  for (i = 0; i < n; i++)
    cin >> B[i];
  ll ret = INF;
  for (i = 0; i < (1ll << n); i++) {
    ret = min(ret, solve(i));
  }
  if (ret == INF)
    ret = -1;
  cout << ret << endl;
  return 0;
}