N, M = gets.split.map(&:to_i) J = N.times.map { gets.split.map(&:to_i) } J.sort_by! { |v, w| -v } dp = Array.new(M + 1, 0) dp2 = Array.new(M + 1, 0) J.each do |v, w| (M - w).downto(0) do |i| nw = i + w if dp[nw] < (dp2[i] + v) * v dp[nw] = (dp2[i] + v) * v dp2[nw] = dp2[i] + v end end end puts dp.max