Problem p03585 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(), (x).end()
const int mod = 1000000007, MAX = 1 << 15;
const ll INF = 1LL << 40;
int bit[MAX + 1], N;

// 1-indexed

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

// sからtの和=sum(t)-sum(s-1)

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

struct edge {
  double a;
  double b;
  double c;
};

int main() {

  std::ifstream in("text.txt");
  std::cin.rdbuf(in.rdbuf());
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> N;
  vector<edge> S(N);
  for (int i = 0; i < N; i++)
    cin >> S[i].a >> S[i].b >> S[i].c;

  sort(all(S), [](edge a, edge b) { return -a.a / a.b < -b.a / b.b; });

  double left = -INF, right = INF, ansx, ansy;

  for (int k = 0; k < 100; k++) {
    double mid = (left + right) / 2;
    map<double, int> MA;
    vector<double> Y(N);
    for (int i = 0; i < N; i++) {
      Y[i] = (-S[i].a * mid + S[i].c) / S[i].b;
      MA[Y[i]]++;
      // cout<<Y[i]<<" ";
    }
    int cnt = 1;
    for (auto it = MA.begin(); it != MA.end(); it++) {
      (*it).second = cnt;
      cnt++;
    }
    for (int i = 0; i < N; i++)
      Y[i] = MA[Y[i]];

    memset(bit, 0, sizeof(bit));

    ll res = 0;

    for (int i = 0; i < N; i++) {
      res += sum(N) - sum(Y[i] - 1);
      add(Y[i], 1);
    }

    if (res >= N * (N - 1) / 2 / 2 + 1)
      left = mid;
    else
      right = mid;

    // cout<<mid<<" "<<res<<endl;
  }
  ansx = left;

  for (int i = 0; i < N; i++) {
    swap(S[i].a, S[i].b);
    S[i].b *= -1;
  }

  sort(all(S), [](edge a, edge b) { return -a.a / a.b < -b.a / b.b; });

  left = -INF;
  right = INF;

  for (int k = 0; k < 100; k++) {
    double mid = (left + right) / 2;
    map<double, int> MA;
    vector<double> Y(N);
    for (int i = 0; i < N; i++) {
      Y[i] = (-S[i].a * mid + S[i].c) / S[i].b;
      MA[Y[i]]++;
      // cout<<Y[i]<<" ";
    }
    int cnt = 1;
    for (auto it = MA.begin(); it != MA.end(); it++) {
      (*it).second = cnt;
      cnt++;
    }
    for (int i = 0; i < N; i++)
      Y[i] = MA[Y[i]];

    memset(bit, 0, sizeof(bit));

    ll res = 0;

    for (int i = 0; i < N; i++) {
      res += sum(N) - sum(Y[i] - 1);
      add(Y[i], 1);
    }

    if (res >= N * (N - 1) / 2 / 2 + 1)
      left = mid;
    else
      right = mid;

    // cout<<mid<<" "<<res<<endl;
  }
  ansy = left;

  cout << setprecision(25) << ansx << " " << ansy << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(), (x).end()
const int mod = 1000000007, MAX = 1 << 17;
const ll INF = 1LL << 40;
int bit[MAX + 1], N;

// 1-indexed

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

// sからtの和=sum(t)-sum(s-1)

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

struct edge {
  double a;
  double b;
  double c;
};

int main() {

  std::ifstream in("text.txt");
  std::cin.rdbuf(in.rdbuf());
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> N;
  vector<edge> S(N);
  for (int i = 0; i < N; i++)
    cin >> S[i].a >> S[i].b >> S[i].c;

  sort(all(S), [](edge a, edge b) { return -a.a / a.b < -b.a / b.b; });

  double left = -INF, right = INF, ansx, ansy;

  for (int k = 0; k < 100; k++) {
    double mid = (left + right) / 2;
    map<double, int> MA;
    vector<double> Y(N);
    for (int i = 0; i < N; i++) {
      Y[i] = (-S[i].a * mid + S[i].c) / S[i].b;
      MA[Y[i]]++;
      // cout<<Y[i]<<" ";
    }
    int cnt = 1;
    for (auto it = MA.begin(); it != MA.end(); it++) {
      (*it).second = cnt;
      cnt++;
    }
    for (int i = 0; i < N; i++)
      Y[i] = MA[Y[i]];

    memset(bit, 0, sizeof(bit));

    ll res = 0;

    for (int i = 0; i < N; i++) {
      res += sum(N) - sum(Y[i] - 1);
      add(Y[i], 1);
    }

    if (res >= N * (N - 1) / 2 / 2 + 1)
      left = mid;
    else
      right = mid;

    // cout<<mid<<" "<<res<<endl;
  }
  ansx = left;

  for (int i = 0; i < N; i++) {
    swap(S[i].a, S[i].b);
    S[i].b *= -1;
  }

  sort(all(S), [](edge a, edge b) { return -a.a / a.b < -b.a / b.b; });

  left = -INF;
  right = INF;

  for (int k = 0; k < 100; k++) {
    double mid = (left + right) / 2;
    map<double, int> MA;
    vector<double> Y(N);
    for (int i = 0; i < N; i++) {
      Y[i] = (-S[i].a * mid + S[i].c) / S[i].b;
      MA[Y[i]]++;
      // cout<<Y[i]<<" ";
    }
    int cnt = 1;
    for (auto it = MA.begin(); it != MA.end(); it++) {
      (*it).second = cnt;
      cnt++;
    }
    for (int i = 0; i < N; i++)
      Y[i] = MA[Y[i]];

    memset(bit, 0, sizeof(bit));

    ll res = 0;

    for (int i = 0; i < N; i++) {
      res += sum(N) - sum(Y[i] - 1);
      add(Y[i], 1);
    }

    if (res >= N * (N - 1) / 2 / 2 + 1)
      left = mid;
    else
      right = mid;

    // cout<<mid<<" "<<res<<endl;
  }
  ansy = left;

  cout << setprecision(25) << ansx << " " << ansy << endl;
}