N,M=map(int,input().split()) dp=[0]*(M+1) np=[0]*(M+1) L=[] for i in range(N): c,d=map(int,input().split()) L.append((c,d)) L.sort() result=0 for i in range(N): a,b=L[i][:] for x in range(a,M+1): np[x]=max(dp[x-a]+b,np[x]) for x in range(a): np[x]=dp[x] w=max(np) result=max(result,w) for x in range(M+1): if 2*x>M: break dp[2*x]=np[x] print(result)