#include using namespace std; vector sol(vector>& wv, const int MAX_W) { vector dp(MAX_W + 1, -1e9); dp[0] = 0; for (int i = 0; i < wv.size(); i++) { vector ndp(MAX_W + 1, -1e9); auto [w, v] = wv[i]; for (int i = 0; i <= MAX_W; i++) { ndp[i] = max(ndp[i], dp[i]); if(i + w <= MAX_W) ndp[i + w] = max(ndp[i + w], dp[i] + v); } dp.swap(ndp); } return dp; } int main() { int n, max_w, d; cin >> n >> max_w >> d; vector> t0, t1; for (int i = 0; i < n; i++) { int t, w, v; cin >> t >> w >> v; if (t == 0) t0.emplace_back(w, v); if (t == 1) t1.emplace_back(w, v); } vector dp0 = sol(t0, max_w); vector dp1 = sol(t1, max_w); int ans = 0; for (int i = 0; i <= max_w; i++) { for (int j = 0; j <= max_w; j++) { if (i + j > max_w) break; if (abs(i - j) > d) continue; ans = max(ans, dp0[i] + dp1[j]); } } cout << ans << endl; }