#include using namespace std; using ll = long long; using ld = long double; using vll = vector; using pll = pair; #define rep(i,n) for(int i=0;i<(n);i++) #define rrep(i,n) for(int i=(n)-1;0<=i;i--) #define REP(i,n) for(int i=1;i<=n;i++) #define all(a) a.begin(),a.end() #define sort(a) sort(all(a)) #define rev(a) reverse(all(a)) char el='\n'; void YN(bool f){cout<<(f?"Yes":"No")<<"\n";} template bool chmin(T& x,T y){if(x>y){x=y;return true;}return false;} template bool chmax(T& x,T y){if(x istream &operator>>(istream &is, vector &v){ for(T &in : v) is >> in; return is;} template ostream &operator<<(ostream &os, vector &v){ rep(i,v.size()) os << v[i] << (i+1==v.size()?"":" "); return os;} template struct LazySegmentTree{ private: int n=1; vector k; vector lazy; vector flag; public: void eval(int i,int l,int r){ if(flag[i]){ ch(k[i],lazy[i]); if(l+1 a){ int m=a.size(); while(n(n*2,op_id); lazy=vector(n*2,ef_id); flag=vector(n*2,false); rep(i,m) k[n+i]=a[i]; for(int i=n-1;0> n >> t; vll l(n), r(n), p(n); rep(i,n) cin >> l[i] >> r[i] >> p[i]; LazySegmentTree sg(vll(202020)); rep(i,n) sg.update(l[i], r[i]+1, p[i]); vll dp(202020); rep(i,202020){ if(i) chmax(dp[i], dp[i-1]); if(i+t<202020) chmax(dp[i+t], dp[i]+sg.query(i,i+1)); } cout << dp[202010] << el; }