#include using namespace std; #define rep(i, n) for (int i = 0; i < (n); ++i) using ll = long long; using ull = unsigned long long; int main() { cin.tie(nullptr)->sync_with_stdio(false); int n, m; cin >> n >> m; vector> v(n); rep(i, n) cin >> v[i].first >> v[i].second; sort(v.rbegin(), v.rend()); ll ans = 0; constexpr ll INF = 1e11; vector dp(n + 1, vector(m + 1, -INF)); dp[0][0] = 0; rep(i, n) { rep(j, m + 1) { dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]); if (j + v[i].second <= m) { dp[i + 1][j + v[i].second] = max(dp[i + 1][j + v[i].second], dp[i][j] + v[i].first); ans = max(ans, v[i].first * dp[i + 1][j + v[i].second]); } } } cout << ans << '\n'; return 0; }