// A cans -> B cans #include // #include #include #include using namespace std; // using namespace atcoder; // using mint = modint998244353; // using mint = modint1000000007; using vi = vector; using vvi = vector>; using ll = long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep2(i, f, n) for (int i = (int) f; i < (int)(n); i++) #define repd(i, n, l) for (int i = (int) n; i >= (int) l; i--) const ll inf = ll(1e9+7); int main() { int n, m; cin >> n >> m; vector> C; rep(i, n){ ll a, b, c; cin >> a >> b >> c; C.push_back({a, b, c}); } sort(C.begin(), C.end(), [](vector &left, vector &right){ ll a1 = left[1] * left[2]; ll b1 = left[0] - left[1]; ll a2 = right[1] * right[2]; ll b2 = right[0] - right[1]; if (a1 * b2 > a2 * b1) return true; else if (a1 * b2 == a2 * b1 && left[0] < right[0]) return true; else return false; }); vector ans(m+1, 0); for (int p = 1; p <= m; p++){ ans[p] = max(ans[p], ans[p-1]); ll now = p; for (auto c : C){ if (c[0] > now) continue; ll temp = 0; ll now_i = 0; now -= c[0]; now_i += c[1]; temp += c[1]*c[2]; ans[p] = max(ans[p], temp + ans[now]); while (now + now_i >= c[0]){ now -= (c[0] - c[1]); temp += c[1] * c[2]; ans[p] = max(ans[p], temp + ans[now]); } } } for (int i = 1; i <= m; i++){ cout << ans[i] << endl; } return 0; }