Problem p03040 (C++)

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

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using R = long double;
const R EPS = 1e-9L; // [-1000,1000]->EPS=1e-8 [-10000,10000]->EPS=1e-7
inline int sgn(const R &r) { return (r > EPS) - (r < -EPS); }
inline R sq(R x) { return sqrt(max(x, 0.0L)); }

template <typename T> vector<T> make_vector(size_t sz) { return vector<T>(sz); }

template <typename T, typename... Ts> auto make_vector(size_t sz, Ts... ts) {
  return vector<decltype(make_vector<T>(ts...))>(sz, make_vector<T>(ts...));
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value != 0>::type fill_value(U &u,
                                                               const V... v) {
  u = U(v...);
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value == 0>::type fill_value(U &u,
                                                               const V... v) {
  for (auto &e : u) {
    fill_value<T>(e, v...);
  }
}

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

const pid_t pid = getpid();
// Problem Specific Parameter:

template <int depth> struct Binary_indexed_tree {
  using T = int;

  const static int h = depth;
  const static int n = 1 << h;
  T data[n];

  void init() { fill_n(data, n, 0); }

  void update(int i, T x) {
    for (i++; i < n; i += i & -i) {
      data[i] += x;
    }
  }

  int lower_bound(T x) {
    if (x <= 0)
      return 0;
    int i = 0;
    for (int k = n; k > 0; k >>= 1) {
      if (i + k < n and data[i + k] < x)
        x -= data[i + k], i += k;
    }
    return i + 1;
  }
};

const int limit = 100010;
int t[limit], a[limit], b[limit];

vector<int> ary;

#define error(args...)                                                         \
  {                                                                            \
    vector<string> _debug = split(#args, ',');                                 \
    err(begin(_debug), args);                                                  \
  }

vector<string> split(const string &s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c))
    v.emplace_back(x);
  return move(v);
}

void err(vector<string>::iterator it) { cerr << endl; }
template <typename T, typename... Args>
void err(vector<string>::iterator it, T aa, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << aa << " ",
      err(++it, args...);
}

int main(void) {
  int q;
  cin >> q;

  rep(i, q) {
    cin >> t[i];
    if (t[i] == 1) {
      cin >> a[i] >> b[i];
      ary.push_back(a[i]);
    }
  }

  sort(begin(ary), end(ary));
  ary.erase(unique(begin(ary), end(ary)), end(ary));

  Binary_indexed_tree<18> bit;
  bit.init();

  int cnt = 0;
  const int inf = 1 << 30;
  int ans_pos_l = -inf;
  int ans_pos_r = inf;
  ll ans_min = 0LL;

  rep(i, q) {
    if (t[i] == 1) {
      ans_min += b[i];
      const int idx = lower_bound(begin(ary), end(ary), a[i]) - begin(ary);

      bit.update(idx, 1);

      cnt++;
      const int half_l = (cnt + 1) / 2;
      const int half_r = (cnt + 2) / 2;

      const int tar_idx_l = bit.lower_bound(half_l) - 1;
      const ll tar_val_l = ary[tar_idx_l];

      const int tar_idx_r = bit.lower_bound(half_r) - 1;
      const ll tar_val_r = ary[tar_idx_r];

      if (a[i] <= ans_pos_l) {
        ans_min += abs(ans_pos_l - a[i]);
      }

      if (ans_pos_r <= a[i]) {
        ans_min += abs(ans_pos_r - a[i]);
      }

      ans_pos_l = tar_val_l;
      ans_pos_r = tar_val_r;

      // error(ans_pos_l, ans_pos_r, ans_min);
    } else {
      cout << ans_pos_l << " " << ans_min << endl;
    }
  }

  return 0;
}

// |x - 1| + |x - 3| == 2
// |x - 1| + |x - 3| + |x - 5| == 4


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

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using R = long double;
const R EPS = 1e-9L; // [-1000,1000]->EPS=1e-8 [-10000,10000]->EPS=1e-7
inline int sgn(const R &r) { return (r > EPS) - (r < -EPS); }
inline R sq(R x) { return sqrt(max(x, 0.0L)); }

template <typename T> vector<T> make_vector(size_t sz) { return vector<T>(sz); }

template <typename T, typename... Ts> auto make_vector(size_t sz, Ts... ts) {
  return vector<decltype(make_vector<T>(ts...))>(sz, make_vector<T>(ts...));
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value != 0>::type fill_value(U &u,
                                                               const V... v) {
  u = U(v...);
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value == 0>::type fill_value(U &u,
                                                               const V... v) {
  for (auto &e : u) {
    fill_value<T>(e, v...);
  }
}

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

const pid_t pid = getpid();
// Problem Specific Parameter:

template <int depth> struct Binary_indexed_tree {
  using T = int;

  const static int h = depth;
  const static int n = 1 << h;
  T data[n];

  void init() { fill_n(data, n, 0); }

  void update(int i, T x) {
    for (i++; i < n; i += i & -i) {
      data[i] += x;
    }
  }

  int lower_bound(T x) {
    if (x <= 0)
      return 0;
    int i = 0;
    for (int k = n; k > 0; k >>= 1) {
      if (i + k < n and data[i + k] < x)
        x -= data[i + k], i += k;
    }
    return i + 1;
  }
};

const int limit = 200010;
int t[limit], a[limit], b[limit];

vector<int> ary;

#define error(args...)                                                         \
  {                                                                            \
    vector<string> _debug = split(#args, ',');                                 \
    err(begin(_debug), args);                                                  \
  }

vector<string> split(const string &s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c))
    v.emplace_back(x);
  return move(v);
}

void err(vector<string>::iterator it) { cerr << endl; }
template <typename T, typename... Args>
void err(vector<string>::iterator it, T aa, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << aa << " ",
      err(++it, args...);
}

int main(void) {
  int q;
  cin >> q;

  rep(i, q) {
    cin >> t[i];
    if (t[i] == 1) {
      cin >> a[i] >> b[i];
      ary.push_back(a[i]);
    }
  }

  sort(begin(ary), end(ary));
  ary.erase(unique(begin(ary), end(ary)), end(ary));

  Binary_indexed_tree<18> bit;
  bit.init();

  int cnt = 0;
  const int inf = 1 << 30;
  int ans_pos_l = -inf;
  int ans_pos_r = inf;
  ll ans_min = 0LL;

  rep(i, q) {
    if (t[i] == 1) {
      ans_min += b[i];
      const int idx = lower_bound(begin(ary), end(ary), a[i]) - begin(ary);

      bit.update(idx, 1);

      cnt++;
      const int half_l = (cnt + 1) / 2;
      const int half_r = (cnt + 2) / 2;

      const int tar_idx_l = bit.lower_bound(half_l) - 1;
      const ll tar_val_l = ary[tar_idx_l];

      const int tar_idx_r = bit.lower_bound(half_r) - 1;
      const ll tar_val_r = ary[tar_idx_r];

      if (a[i] <= ans_pos_l) {
        ans_min += abs(ans_pos_l - a[i]);
      }

      if (ans_pos_r <= a[i]) {
        ans_min += abs(ans_pos_r - a[i]);
      }

      ans_pos_l = tar_val_l;
      ans_pos_r = tar_val_r;

      // error(ans_pos_l, ans_pos_r, ans_min);
    } else {
      cout << ans_pos_l << " " << ans_min << endl;
    }
  }

  return 0;
}

// |x - 1| + |x - 3| == 2
// |x - 1| + |x - 3| + |x - 5| == 4