Problem p03504 (C++)

Buggy submission (status: Time Limit Exceeded):
#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
#include <random>
// #include "util.k"

using namespace std;

// 呪文
#define DUMPOUT cout
#define dump(...)                                                              \
  DUMPOUT << "  ";                                                             \
  DUMPOUT << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]"   \
          << endl;                                                             \
  DUMPOUT << "    ";                                                           \
  dump_func(__VA_ARGS__)

typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
typedef pair<string, string> pss;
template <typename _KTy, typename _Ty>
ostream &operator<<(ostream &ostr, const pair<_KTy, _Ty> &m) {
  ostr << "{" << m.first << ", " << m.second << "}";
  return ostr;
}
template <typename _KTy, typename _Ty>
ostream &operator<<(ostream &ostr, const map<_KTy, _Ty> &m) {
  if (m.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << *m.begin();
  for (auto itr = ++m.begin(); itr != m.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty>
ostream &operator<<(ostream &ostr, const vector<_Ty> &v) {
  if (v.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << v.front();
  for (auto itr = ++v.begin(); itr != v.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty> ostream &operator<<(ostream &ostr, const set<_Ty> &s) {
  if (s.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << *(s.begin());
  for (auto itr = ++s.begin(); itr != s.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty>
ostream &operator<<(ostream &ostr, const stack<_Ty> &s) {
  if (s.empty()) {
    ostr << "{ }";
    return ostr;
  }
  stack<_Ty> t(s);
  ostr << "{" << t.top();
  t.pop();
  while (!t.empty()) {
    ostr << ", " << t.top();
    t.pop();
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty> ostream &operator<<(ostream &ostr, const list<_Ty> &l) {
  if (l.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << l.front();
  for (auto itr = ++l.begin(); itr != l.end(); ++itr) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _KTy, typename _Ty>
istream &operator>>(istream &istr, pair<_KTy, _Ty> &m) {
  istr >> m.first >> m.second;
  return istr;
}
template <typename _Ty> istream &operator>>(istream &istr, vector<_Ty> &v) {
  for (size_t i = 0; i < v.size(); i++)
    istr >> v[i];
  return istr;
}
ll modpow(ll n, ll p, ll m) {
  ll result = 1;
  while (p > 0) {
    if (p & 1)
      result = (result * n) % m;
    p >>= 1;
    n = (n * n) % m;
  }
  return result;
}
template <typename _Ty> _Ty ipow(_Ty x, _Ty n) {
  _Ty ret = _Ty(1);
  for (_Ty i = _Ty(0); i < n; i++)
    ret *= x;
  return ret;
}
template <typename A, size_t N, typename T>
inline void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

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)...);
}

#define PI 3.14159265358979323846
#define EPS 1e-11
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define fake false

void merge(vector<pii> &v) {
  if (SZ(v) <= 1)
    return;
  for (int i = 0; i < SZ(v) - 1; i++) {
    // while (v.begin() + i + 1 != v.end() && v[i].second == v[i + 1].first) {
    if (v[i].second == v[i + 1].first) {
      v[i].second = v[i + 1].second;
      for (int j = i + 1; j < SZ(v) - 1; j++)
        v[j] = v[j + 1];
      v.pop_back();
      i--;
    }
  }
}

void delay(vector<pii> &v) { REP(i, SZ(v)) v[i].first--; }

int imos[202020];

int main() {
  // clock_t start, end;
  // start = clock();

  ios::sync_with_stdio(false);
  cin.tie(0);

  int N, C;
  cin >> N >> C;

  vector<vector<pii>> S(C);

  REP(i, N) {
    int s, t, c;
    cin >> s >> t >> c;

    s *= 2;
    t *= 2;
    c--;

    S[c].push_back(pii(s, t));
  }
  REP(i, C) {
    sort(all(S[i]));
    merge(S[i]);
    delay(S[i]);
  }

  REP(i, C) REP(j, SZ(S[i])) {
    imos[S[i][j].first]++;
    imos[S[i][j].second + 1]--;
  }

  int ans = 0;
  REP(i, 200010) imos[i + 1] += imos[i];
  REP(i, 200010) ans = max(ans, imos[i]);

  cout << ans << endl;

  // end = clock();
  // printf("%d msec.\n", end - start);

  return 0;
}

Fixed submission:
#define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
#include <random>
// #include "util.k"

using namespace std;

// 呪文
#define DUMPOUT cout
#define dump(...)                                                              \
  DUMPOUT << "  ";                                                             \
  DUMPOUT << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]"   \
          << endl;                                                             \
  DUMPOUT << "    ";                                                           \
  dump_func(__VA_ARGS__)

typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
typedef pair<string, string> pss;
template <typename _KTy, typename _Ty>
ostream &operator<<(ostream &ostr, const pair<_KTy, _Ty> &m) {
  ostr << "{" << m.first << ", " << m.second << "}";
  return ostr;
}
template <typename _KTy, typename _Ty>
ostream &operator<<(ostream &ostr, const map<_KTy, _Ty> &m) {
  if (m.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << *m.begin();
  for (auto itr = ++m.begin(); itr != m.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty>
ostream &operator<<(ostream &ostr, const vector<_Ty> &v) {
  if (v.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << v.front();
  for (auto itr = ++v.begin(); itr != v.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty> ostream &operator<<(ostream &ostr, const set<_Ty> &s) {
  if (s.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << *(s.begin());
  for (auto itr = ++s.begin(); itr != s.end(); itr++) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty>
ostream &operator<<(ostream &ostr, const stack<_Ty> &s) {
  if (s.empty()) {
    ostr << "{ }";
    return ostr;
  }
  stack<_Ty> t(s);
  ostr << "{" << t.top();
  t.pop();
  while (!t.empty()) {
    ostr << ", " << t.top();
    t.pop();
  }
  ostr << "}";
  return ostr;
}
template <typename _Ty> ostream &operator<<(ostream &ostr, const list<_Ty> &l) {
  if (l.empty()) {
    ostr << "{ }";
    return ostr;
  }
  ostr << "{" << l.front();
  for (auto itr = ++l.begin(); itr != l.end(); ++itr) {
    ostr << ", " << *itr;
  }
  ostr << "}";
  return ostr;
}
template <typename _KTy, typename _Ty>
istream &operator>>(istream &istr, pair<_KTy, _Ty> &m) {
  istr >> m.first >> m.second;
  return istr;
}
template <typename _Ty> istream &operator>>(istream &istr, vector<_Ty> &v) {
  for (size_t i = 0; i < v.size(); i++)
    istr >> v[i];
  return istr;
}
ll modpow(ll n, ll p, ll m) {
  ll result = 1;
  while (p > 0) {
    if (p & 1)
      result = (result * n) % m;
    p >>= 1;
    n = (n * n) % m;
  }
  return result;
}
template <typename _Ty> _Ty ipow(_Ty x, _Ty n) {
  _Ty ret = _Ty(1);
  for (_Ty i = _Ty(0); i < n; i++)
    ret *= x;
  return ret;
}
template <typename A, size_t N, typename T>
inline void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

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)...);
}

#define PI 3.14159265358979323846
#define EPS 1e-11
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define fake false

void merge(vector<pii> &v) {
  if (SZ(v) <= 1)
    return;
  for (int i = 0; i < SZ(v) - 1; i++) {
    // while (v.begin() + i + 1 != v.end() && v[i].second == v[i + 1].first) {
    int j = i;
    while (v.begin() + j + 1 != v.end() && v[j].second == v[j + 1].first)
      j++;
    v[i].second = v[j].second;
    v.erase(v.begin() + i + 1, v.begin() + j + 1);
  }
}

void delay(vector<pii> &v) { REP(i, SZ(v)) v[i].first--; }

int imos[202020];

int main() {
  // clock_t start, end;
  // start = clock();

  ios::sync_with_stdio(false);
  cin.tie(0);

  int N, C;
  cin >> N >> C;

  vector<vector<pii>> S(C);

  REP(i, N) {
    int s, t, c;
    cin >> s >> t >> c;

    s *= 2;
    t *= 2;
    c--;

    S[c].push_back(pii(s, t));
  }
  REP(i, C) {
    sort(all(S[i]));
    merge(S[i]);
    delay(S[i]);
  }

  REP(i, C) REP(j, SZ(S[i])) {
    imos[S[i][j].first]++;
    imos[S[i][j].second + 1]--;
  }

  int ans = 0;
  REP(i, 200010) imos[i + 1] += imos[i];
  REP(i, 200010) ans = max(ans, imos[i]);

  cout << ans << endl;

  // end = clock();
  // printf("%d msec.\n", end - start);

  return 0;
}