Problem p02948 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace std;
const auto MOD = 1000000007;
const int INF = 1e9;
const long long LINF = 1e18;
#define rep(i, n) for (int i = 0; i < (n); i++)
typedef pair<int, int> PII;
typedef pair<long, long> PLL;
typedef vector<int> VI;
typedef vector<long long> VLL;

int n, m;
bool jfsort(PII a, PII b) { return a.first > b.first; }
bool jssort(PII a, PII b) { return a.second < b.second; }

// index が条件を満たすかどうか vector<>maeに検索したいvectorを入れる
// keyを超える最小の要素番号を返す
bool isOK(int index, long long key, deque<PII> &mae) {
  if (mae[index].second >= key)
    return true;
  else
    return false;
}

// 汎用的な二分探索のテンプレ
int binary_search(long long key, deque<PII> &mae) {
  int left = -1; // 「index = 0」が条件を満たすこともあるので、初期値は -1
  int right = (int)mae.size(); // 「index =
                               // a.size()-1」が条件を満たさないこともあるので、初期値は
                               // a.size()

  /* どんな二分探索でもここの書き方を変えずにできる！ */
  while (right - left > 1) {
    int mid = left + (right - left) / 2;

    if (isOK(mid, key, mae))
      right = mid;
    else
      left = mid;
  }

  /* left は条件を満たさない最大の値、right は条件を満たす最小の値になっている
   */
  return right;
}

int main() {
  cin >> n >> m;
  long long ans = 0;
  vector<PII> job(n);
  for (int i = 0; i < n; i++) {
    cin >> job[i].first >> job[i].second; // fir日sec報酬
  }
  sort(job.begin(), job.end(), jfsort);
  deque<PII> temp;
  int iter = n - 1;
  for (int i = 0; i < m; i++) {
    while (iter + 1) {
      if (job[iter].first == i + 1) {
        int a = binary_search(job[iter].second, temp);
        temp.insert(temp.begin() + a, job[iter]);
        iter--;
      } else {
        break;
      }
    }
    int siz = temp.size();
    if (siz - m + i > 0) {
      temp.erase(temp.begin(), temp.begin() + (siz - m + i));
    } //
    if (temp.size()) {
      sort(temp.begin(), temp.end(), jssort);
      ans += temp.back().second;
      temp.pop_back();
    }
  }
  cout << ans << endl;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace std;
const auto MOD = 1000000007;
const int INF = 1e9;
const long long LINF = 1e18;
#define rep(i, n) for (int i = 0; i < (n); i++)
typedef pair<int, int> PII;
typedef pair<long, long> PLL;
typedef vector<int> VI;
typedef vector<long long> VLL;

int n, m;
bool jfsort(PII a, PII b) { return a.first > b.first; }
bool jssort(PII a, PII b) { return a.second < b.second; }

// index が条件を満たすかどうか vector<>maeに検索したいvectorを入れる
// keyを超える最小の要素番号を返す
bool isOK(int index, long long key, deque<PII> &mae) {
  if (mae[index].second >= key)
    return true;
  else
    return false;
}

// 汎用的な二分探索のテンプレ
int binary_search(long long key, deque<PII> &mae) {
  int left = -1; // 「index = 0」が条件を満たすこともあるので、初期値は -1
  int right = (int)mae.size(); // 「index =
                               // a.size()-1」が条件を満たさないこともあるので、初期値は
                               // a.size()

  /* どんな二分探索でもここの書き方を変えずにできる！ */
  while (right - left > 1) {
    int mid = left + (right - left) / 2;

    if (isOK(mid, key, mae))
      right = mid;
    else
      left = mid;
  }

  /* left は条件を満たさない最大の値、right は条件を満たす最小の値になっている
   */
  return right;
}

int main() {
  cin >> n >> m;
  long long ans = 0;
  vector<PII> job(n);
  for (int i = 0; i < n; i++) {
    cin >> job[i].first >> job[i].second; // fir日sec報酬
  }
  sort(job.begin(), job.end(), jfsort);
  deque<PII> temp;
  int iter = n - 1;
  for (int i = 0; i < m; i++) {
    while (iter + 1) {
      if (job[iter].first == i + 1) {
        int a = binary_search(job[iter].second, temp);
        temp.insert(temp.begin() + a, job[iter]);
        iter--;
      } else {
        break;
      }
    }
    int siz = temp.size();
    if (siz - m + i > 0) {
      temp.erase(temp.begin(), temp.begin() + (siz - m + i));
    } //
    if (temp.size()) {
      ans += temp.back().second;
      temp.pop_back();
    }
  }
  cout << ans << endl;
}