Problem p03483 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define INF 2e9
#define ll long long
// 文字列を右半分、真ん中、左半分の三種類に分けたとき
// 右半分の文字列が左半分の反転になるように操作すればよい。

int bit[200006];
int n = 200005;

// BIT
int sum(int i) {
  int s = 0;
  while (i > 0) {
    s += bit[i];
    i -= i & -i;
  }
  return s;
}

void add(int i, int x) {
  while (i <= n) {
    bit[i] += x;
    i += i & -i;
  }
}

int main() {
  string s;
  cin >> s;

  vector<vector<int>> v(26);

  for (int i = 0; i < s.size(); i++) {
    v[s[i] - 'a'].emplace_back(i);
  }

  int tmp = 0;
  for (int i = 0; i < 26; i++) {
    if (v[i].size() % 2 == 1) {
      tmp++;
    }
  }
  if (tmp > 1) {
    cout << "-1" << endl;
    return 0;
  }

  pair<int, int> p[26];
  for (int i = 0; i < 26; i++) {
    p[i] = make_pair(0, v[i].size() - 1);
  }

  int len = s.size() - 1;
  long long ans = 0;

  for (int i = 0; i < s.size() / 2; i++) {
    int t;
    int minCost = INF;

    for (int j = 0; j < 26; j++) {
      if (v[j].size() <= 1) {
        continue;
      }

      int front, back;
      tie(front, back) = p[j];
      if (front >= back) {
        continue;
      }

      int front_p = v[j][front];
      int back_p = v[j][back];

      int left = front_p - sum(front_p + 1);
      int right = back_p - sum(back_p + 1);

      int cost = left + (len - right);
      if (minCost > cost) {
        minCost = cost;
        t = j;
      }
    }

    ans += minCost;
    add(v[t][p[t].first] + 1, 1);
    add(v[t][p[t].second] + 1, 1);
    p[t].first++;
    p[t].second++;
    len -= 2;
  }

  cout << ans << endl;

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define INF 2e9
#define ll long long
// 文字列を右半分、真ん中、左半分の三種類に分けたとき
// 右半分の文字列が左半分の反転になるように操作すればよい。

int bit[200006];
int n = 200005;

// BIT
int sum(int i) {
  int s = 0;
  while (i > 0) {
    s += bit[i];
    i -= i & -i;
  }
  return s;
}

void add(int i, int x) {
  while (i <= n) {
    bit[i] += x;
    i += i & -i;
  }
}

int main() {
  string s;
  cin >> s;

  vector<vector<int>> v(26);

  for (int i = 0; i < s.size(); i++) {
    v[s[i] - 'a'].emplace_back(i);
  }

  int tmp = 0;
  for (int i = 0; i < 26; i++) {
    if (v[i].size() % 2 == 1) {
      tmp++;
    }
  }
  if (tmp > 1) {
    cout << "-1" << endl;
    return 0;
  }

  pair<int, int> p[26];
  for (int i = 0; i < 26; i++) {
    p[i] = make_pair(0, v[i].size() - 1);
  }

  int len = s.size() - 1;
  long long ans = 0;

  for (int i = 0; i < s.size() / 2; i++) {
    int t;
    int minCost = INF;

    for (int j = 0; j < 26; j++) {
      if (v[j].size() <= 1) {
        continue;
      }

      int front, back;
      tie(front, back) = p[j];
      if (front >= back) {
        continue;
      }

      int front_p = v[j][front];
      int back_p = v[j][back];

      int left = front_p - sum(front_p + 1);
      int right = back_p - sum(back_p + 1);

      int cost = left + (len - right);
      if (minCost > cost) {
        minCost = cost;
        t = j;
      }
    }

    ans += minCost;
    add(v[t][p[t].first] + 1, 1);
    add(v[t][p[t].second] + 1, 1);
    p[t].first++;
    p[t].second--;
    len -= 2;
  }

  cout << ans << endl;

  return 0;
}