Problem p02948 (C++)

Buggy submission (status: Time Limit Exceeded):
#ifdef DEBUG_IS_VALID
#define DEB 1
#define _LIBCPP_DEBUG 0
#else
#define DEB 0
#define NDEBUG
#endif

#include <bits/stdc++.h>
using namespace std;

#define ALL(g) (g).begin(), (g).end()
#define REP(i, x, n) for (int i = x; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define RREP(i, x, n) for (int i = x; i >= n; i--)
#define rrep(i, n) RREP(i, n, 0)
#define pb push_back
#define fi first
#define se second
#pragma GCC optimize("-O3")

using namespace std;

#define DUMPOUT cout
#define dump(...)                                                              \
  if (DEB)                                                                     \
    DUMPOUT << "  " << #__VA_ARGS__ << " :[" << __LINE__ << ":"                \
            << __FUNCTION__ << "]" << endl                                     \
            << "    ";                                                         \
  if (DEB)                                                                     \
  dump_func(__VA_ARGS__)
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> p) {
  cout << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  os << "{";
  for (int i = 0; i < vec.size(); i++)
    os << vec[i] << (i + 1 == vec.size() ? "" : ", ");
  os << "}";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, set<T> &st) {
  cout << "{";
  for (auto itr = st.begin(); itr != st.end(); itr++)
    cout << *itr << (next(itr) != st.end() ? ", " : "");
  cout << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, map<T1, T2> mp) {
  cout << "{";
  for (auto itr = mp.begin(); itr != mp.end(); itr++)
    cout << "(" << (itr->first) << ", " << (itr->second) << ")"
         << (next(itr) != mp.end() ? "," : "");
  cout << "}";
  return os;
}

void dump_func() { DUMPOUT << endl; }
template <class Head, class... Tail>
void dump_func(Head &&head, Tail &&...tail) {
  DUMPOUT << head;
  if (sizeof...(Tail) == 0) {
    DUMPOUT << " ";
  } else {
    DUMPOUT << ", ";
  }
  dump_func(std::move(tail)...);
}
template <class T> inline bool chmax(T &a, T const &b) {
  if (a >= b)
    return false;
  a = b;
  return true;
}
template <class T> inline bool chmin(T &a, T const &b) {
  if (a <= b)
    return false;
  a = b;
  return true;
}

using ll = long long;
using P = pair<int, int>;
using Pl = pair<ll, ll>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vp = vector<Pl>;
using vvp = vector<vp>;

const int INF = 1 << 29;
const long long LINF = 1LL << 59;

void solve(long long N, long long M, std::vector<long long> A,
           std::vector<long long> B) {
  vector<Pl> c(N);
  rep(i, N) c[i] = {-B[i], A[i]};
  sort(ALL(c));
  set<ll> st;
  rep(i, M) st.insert(-i);
  ll ans = 0;
  rep(i, N) {
    ll a, b;
    a = c[i].second;
    b = -c[i].first;
    auto itr = lower_bound(st.begin(), st.end(), a - M);
    if (itr == st.end()) {
      continue;
    }
    ans += b;
    st.erase(itr);
  }
  cout << ans << endl;
}

int main() {
  std::cout << std::fixed << std::setprecision(15);
  long long N;
  scanf("%lld", &N);
  long long M;
  scanf("%lld", &M);
  std::vector<long long> A(N);
  std::vector<long long> B(N);
  for (int i = 0; i < N; i++) {
    scanf("%lld", &A[i]);
    scanf("%lld", &B[i]);
  }
  solve(N, M, std::move(A), std::move(B));
  return 0;
}


Fixed submission:
#ifdef DEBUG_IS_VALID
#define DEB 1
#define _LIBCPP_DEBUG 0
#else
#define DEB 0
#define NDEBUG
#endif

#include <bits/stdc++.h>
using namespace std;

#define ALL(g) (g).begin(), (g).end()
#define REP(i, x, n) for (int i = x; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define RREP(i, x, n) for (int i = x; i >= n; i--)
#define rrep(i, n) RREP(i, n, 0)
#define pb push_back
#define fi first
#define se second
#pragma GCC optimize("-O3")

using namespace std;

#define DUMPOUT cout
#define dump(...)                                                              \
  if (DEB)                                                                     \
    DUMPOUT << "  " << #__VA_ARGS__ << " :[" << __LINE__ << ":"                \
            << __FUNCTION__ << "]" << endl                                     \
            << "    ";                                                         \
  if (DEB)                                                                     \
  dump_func(__VA_ARGS__)
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> p) {
  cout << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  os << "{";
  for (int i = 0; i < vec.size(); i++)
    os << vec[i] << (i + 1 == vec.size() ? "" : ", ");
  os << "}";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, set<T> &st) {
  cout << "{";
  for (auto itr = st.begin(); itr != st.end(); itr++)
    cout << *itr << (next(itr) != st.end() ? ", " : "");
  cout << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, map<T1, T2> mp) {
  cout << "{";
  for (auto itr = mp.begin(); itr != mp.end(); itr++)
    cout << "(" << (itr->first) << ", " << (itr->second) << ")"
         << (next(itr) != mp.end() ? "," : "");
  cout << "}";
  return os;
}

void dump_func() { DUMPOUT << endl; }
template <class Head, class... Tail>
void dump_func(Head &&head, Tail &&...tail) {
  DUMPOUT << head;
  if (sizeof...(Tail) == 0) {
    DUMPOUT << " ";
  } else {
    DUMPOUT << ", ";
  }
  dump_func(std::move(tail)...);
}
template <class T> inline bool chmax(T &a, T const &b) {
  if (a >= b)
    return false;
  a = b;
  return true;
}
template <class T> inline bool chmin(T &a, T const &b) {
  if (a <= b)
    return false;
  a = b;
  return true;
}

using ll = long long;
using P = pair<int, int>;
using Pl = pair<ll, ll>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vp = vector<Pl>;
using vvp = vector<vp>;

const int INF = 1 << 29;
const long long LINF = 1LL << 59;

void solve(long long N, long long M, std::vector<long long> A,
           std::vector<long long> B) {
  vector<Pl> c(N);
  rep(i, N) c[i] = {-B[i], A[i]};
  sort(ALL(c));
  set<ll> st;
  rep(i, M) st.insert(-i);
  ll ans = 0;
  rep(i, N) {
    ll a, b;
    a = c[i].second;
    b = -c[i].first;
    auto itr = st.lower_bound(a - M);
    if (itr == st.end()) {
      continue;
    }
    ans += b;
    st.erase(itr);
  }
  cout << ans << endl;
}

int main() {
  std::cout << std::fixed << std::setprecision(15);
  long long N;
  scanf("%lld", &N);
  long long M;
  scanf("%lld", &M);
  std::vector<long long> A(N);
  std::vector<long long> B(N);
  for (int i = 0; i < N; i++) {
    scanf("%lld", &A[i]);
    scanf("%lld", &B[i]);
  }
  solve(N, M, std::move(A), std::move(B));
  return 0;
}