#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) ll op(ll a, ll b){ return max(a, b); } ll e(){return 0;} using p = pair; using q = pair; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, T; cin >> n >> T; vector vq; ll m = 0; rep(i, n){ ll l, r, P; cin >> l >> r >> P; vq.push_back({l, {r, P}}); m = max(m, r); }sort(all(vq)); segtree seg(m+1); int itr = 0; set

st; multiset ms; rep(i, m+1){ if(itr < n){ while(vq[itr].first <= i){ st.insert({vq[itr].second.first, itr}); ms.insert(vq[itr].second.second); itr++; if(itr >= n)break; } } ll j = 0; if(ms.size()){ j = *ms.rbegin(); } if(i < T){ seg.set(i, j); }else{ seg.set(i, seg.prod(0, i-T+1) + j); } while(st.size() > 0){ auto it = st.begin(); ll r = it->first, k = it->second; if(i < r)break; st.erase({r, k}); auto it2 = ms.find(vq[k].second.second); ms.erase(it2); } }cout << seg.all_prod() << endl; return 0; }