#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++) using namespace atcoder; using namespace std; typedef long long ll; template , typename U = less> struct priority_queue_ex { priority_queue q, dq; void push(T x) { q.push(x); } T top() { while (dq.size() && q.top() == dq.top()) { q.pop(); dq.pop(); } return q.top(); } T pop() { T ret = top(); q.pop(); return ret; } void erase(T x) { dq.push(x); } int size() { return q.size() - dq.size(); } }; template bool chmax(T &a, S b) { if (a < b) { a = b; return 1; } return 0; } void solve() { int n, t; cin >> n >> t; int mx = 4e5 + 10; vector> event(mx); rep(i, 0, n) { int l, r, p; cin >> l >> r >> p; event[l].emplace_back(p); event[r + 1].emplace_back(-p); } vector mxp(mx); priority_queue_ex pq; rep(i, 0, mx) { for (auto x : event[i]) { if (x >= 0) pq.push(x); else pq.erase(-x); } if (pq.size() > 0) mxp[i] = pq.top(); } vector dp(mx); rep(i, t, mx) { chmax(dp[i], dp[i - t] + mxp[i - t]); chmax(dp[i], dp[i - 1]); } cout << *max_element(dp.begin(), dp.end()) << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }