Problem p02888 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define all(a) a.begin(), a.end()
#define F first
#define S second
#define pb push_back
#define ll long long
#define ld long double
#define mkp make_pair
#define sz(x) (int)x.size()
#define pi pair<long long, long long>
#define watch(x)                                                               \
  cout << (#x) << " is " << (x) << endl;                                       \
  cout.flush()
#define endl '\n'
#define _ << ' '
#define FAST_LOG2(x)                                                           \
  (sizeof(unsigned long) * 8 - 1 - __builtin_clzl((unsigned long)(x)))
#define clog2(x) (((x) - (1 << FAST_LOG2(x))) ? FAST_LOG2(x) + 1 : FAST_LOG2(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    idxset;
// find_by_order(i) : iterator to the value at index i, order_of_key(x) : the
// index of value x
const ll mod = (ll)1e9 + 7;
const ll INF = (ll)1e9 + 1;

int n, a[2001], ans = 0;

int f(int x) {
  int l = 0, r = n;
  int ret = -1;
  while (l < r) {
    int mid = (l + r) / 2;
    if (a[mid] < x) {
      ret = mid;
      l = mid + 1;
    } else {
      r = mid;
    }
  }
  return ret;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
#ifndef ONLINE_JUDGE
  freopen("B.txt", "r", stdin);
#endif
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a, a + n);
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int x = f(a[i] + a[j]);
      if (x > j)
        ans += x - j;
    }
  }
  cout << ans;
}


Fixed submission:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define all(a) a.begin(), a.end()
#define F first
#define S second
#define pb push_back
#define ll long long
#define ld long double
#define mkp make_pair
#define sz(x) (int)x.size()
#define pi pair<long long, long long>
#define watch(x)                                                               \
  cout << (#x) << " is " << (x) << endl;                                       \
  cout.flush()
#define endl '\n'
#define _ << ' '
#define FAST_LOG2(x)                                                           \
  (sizeof(unsigned long) * 8 - 1 - __builtin_clzl((unsigned long)(x)))
#define clog2(x) (((x) - (1 << FAST_LOG2(x))) ? FAST_LOG2(x) + 1 : FAST_LOG2(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    idxset;
// find_by_order(i) : iterator to the value at index i, order_of_key(x) : the
// index of value x
const ll mod = (ll)1e9 + 7;
const ll INF = (ll)1e9 + 1;

int n, a[2001], ans = 0;

int f(int x) {
  int l = 0, r = n;
  int ret = -1;
  while (l < r) {
    int mid = (l + r) / 2;
    if (a[mid] < x) {
      ret = mid;
      l = mid + 1;
    } else {
      r = mid;
    }
  }
  return ret;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
#ifndef ONLINE_JUDGE
// freopen("B.txt", "r", stdin);
#endif
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a, a + n);
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int x = f(a[i] + a[j]);
      if (x > j)
        ans += x - j;
    }
  }
  cout << ans;
}