#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) #define int long long using namespace std; using namespace atcoder; using mint = modint998244353; typedef tuple T; int n, t; vector events; //(time, push(0)/pop(1), val) signed main() { int i, j; cin >> n >> t; rep(i, n) { int l, r, p; cin >> l >> r >> p; events.push_back(T(l, 0, p)); events.push_back(T(r + 1, 1, p)); } sort(events.begin(), events.end()); const int MAX = 200000; multiset st; vector maxS(MAX + 1); j = 0; rep(i, MAX + 1) { for (; j < events.size() && get<0>(events[j]) == i; j++) { int flag = get<1>(events[j]); int val = get<2>(events[j]); if (flag == 0) { st.insert(val); } else { multiset::iterator it = st.find(val); st.erase(it); } } if (st.size() == 0) maxS[i] = 0; else maxS[i] = *st.rbegin(); } const int INF = 1e+15; vector dp(2 * MAX + 1, -INF); dp[0] = 0; rep(i, MAX + 1) { dp[i + 1] = max(dp[i + 1], dp[i]); dp[i + t] = max(dp[i + t], dp[i] + maxS[i]); } int ans = -INF; rep(i, dp.size()) ans = max(ans, dp[i]); cout << ans << endl; return 0; }