Problem p03585 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
typedef long long ll;
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, a) FOR(i, 0, a)

using namespace std;
const int MAX_N = 4e4;
const double INF = 1e18;
ll N;
double A[MAX_N], B[MAX_N], C[MAX_N];
int bit[MAX_N + 1];
ll K;
int query(int x) {
  int ret = 0;
  while (x) {
    ret += bit[x];
    x -= x & (-x);
  }
  return ret;
}
void add(int x, int y) {
  while (x <= N) {
    bit[x] += y;
    x += x & (-x);
  }
}
bool chk(double X) {
  vector<int> inx;
  REP(i, N) inx.push_back(i);
  sort(inx.begin(), inx.end(), [&](int a, int b) {
    return (C[a] - A[a] * X) / B[a] < (C[b] - A[b] * X) / B[b];
  });
  vector<double> kata;
  REP(i, N) { kata.push_back(-A[inx[i]] / B[inx[i]]); }
  vector<int> ckata;
  {
    vector<double> cmp;
    REP(i, N) { cmp.push_back(kata[i]); }
    sort(cmp.begin(), cmp.end());
    REP(i, N) {
      ckata.push_back(lower_bound(cmp.begin(), cmp.end(), kata[i]) -
                      cmp.begin());
    }
  }
  memset(bit, 0, sizeof(bit));
  ll cnt = 0;
  REP(i, N) {
    cnt += query(ckata[i]);
    add(ckata[i] + 1, 1);
  }
  return cnt < K;
}
int main() {
  scanf("%lld", &N);
  REP(i, N) { scanf("%lf %lf %lf", A + i, B + i, C + i); }
  if (N * (N - 1) / 2 % 2 == 0) {
    K = N * (N - 1) / 4;
  } else {
    K = N * (N - 1) / 4 + 1;
  }
  double ansx, ansy;
  REP(q, 2) {
    double lb = -INF, ub = INF;
    REP(i, 200) {
      double mid = (lb + ub) / 2;
      if (chk(mid)) {
        lb = mid;
      } else {
        ub = mid;
      }
    }
    if (q == 0) {
      ansx = ub;
    } else {
      ansy = ub;
    }
    REP(i, N) swap(A[i], B[i]);
  }
  printf("%.12f %.12f\n", ansx, ansy);
}

Fixed submission:
#include <bits/stdc++.h>
typedef long long ll;
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, a) FOR(i, 0, a)

using namespace std;
const int MAX_N = 4e4;
const double INF = 1e18;
ll N;
double A[MAX_N], B[MAX_N], C[MAX_N];
int bit[MAX_N + 1];
ll K;
int query(int x) {
  int ret = 0;
  while (x) {
    ret += bit[x];
    x -= x & (-x);
  }
  return ret;
}
void add(int x, int y) {
  while (x <= N) {
    bit[x] += y;
    x += x & (-x);
  }
}
bool chk(double X) {
  vector<int> inx;
  REP(i, N) inx.push_back(i);
  sort(inx.begin(), inx.end(), [&](int a, int b) {
    return (C[a] - A[a] * X) / B[a] < (C[b] - A[b] * X) / B[b];
  });
  vector<double> kata;
  REP(i, N) { kata.push_back(-A[inx[i]] / B[inx[i]]); }
  vector<int> ckata;
  {
    vector<double> cmp;
    REP(i, N) { cmp.push_back(kata[i]); }
    sort(cmp.begin(), cmp.end());
    REP(i, N) {
      ckata.push_back(lower_bound(cmp.begin(), cmp.end(), kata[i]) -
                      cmp.begin());
    }
  }
  memset(bit, 0, sizeof(bit));
  ll cnt = 0;
  REP(i, N) {
    cnt += query(ckata[i]);
    add(ckata[i] + 1, 1);
  }
  return cnt < K;
}
int main() {
  scanf("%lld", &N);
  REP(i, N) { scanf("%lf %lf %lf", A + i, B + i, C + i); }
  if (N * (N - 1) / 2 % 2 == 0) {
    K = N * (N - 1) / 4;
  } else {
    K = N * (N - 1) / 4 + 1;
  }
  double ansx, ansy;
  REP(q, 2) {
    double lb = -INF, ub = INF;
    REP(i, 100) {
      double mid = (lb + ub) / 2;
      if (chk(mid)) {
        lb = mid;
      } else {
        ub = mid;
      }
    }
    if (q == 0) {
      ansx = ub;
    } else {
      ansy = ub;
    }
    REP(i, N) swap(A[i], B[i]);
  }
  printf("%.12f %.12f\n", ansx, ansy);
}