#include #define snd(t) std::get<1>(t) using ll = std::int64_t; using TR = std::tuple; struct SegmentTree{ int numLeave; std::vector data; SegmentTree(int n){ int m = 1; while(m < n){m *= 2;} numLeave = m; data = std::vector(m * 2, std::numeric_limits::min()); } void set(int k, ll v){ k += numLeave; data[k] = v; while(k >= 2){ k /= 2; data[k] = std::max(data[2 * k], data[2 * k + 1]); } } ll max(int l, int r){ l += numLeave; r += numLeave; ll res = std::numeric_limits::min(); while(l < r){ if(l & 1){res = std::max(res, data[l]); l += 1;} if(r & 1){r -= 1; res = std::max(res, data[r]);} l /= 2; r /= 2; } return res; } ll get(int k){ return data[k + numLeave]; } }; int main(){ std::cin.tie(nullptr); std::ios::sync_with_stdio(false); int N; ll K; std::cin >> N >> K; std::vector T(N), X(N), C(N); for(int i=0;i> T[i]; } for(int i=0;i> X[i]; } for(int i=0;i> C[i]; } std::vector points; std::vector beta{0}; for(int i=0;i::min()){v += c;} seg.set(b, v); } ll res = seg.max(0, beta.size()); std::cout << res << std::endl; }