#include<bits/stdc++.h>
using namespace std;
vector<int> idk[50];
vector<int> dp[50];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long long n,m,a,b;
cin >> n >> m;
vector<pair<long long,long long>> haha(0);
for(long long i = 0; i < n; i++) {
cin >> a >> b;
haha.push_back({b,a});
}
sort(haha.begin(),haha.end());
long long y = 0;
vector<long long> br(n,-1);
for(long long i = 0; i < haha.size(); i++) {
if(i > 0 && haha[i].first != haha[i-1].first) {
y++;
}
idk[y].push_back(haha[i].second);
br[y] = haha[i].first;
}
for(long long i = 0; i < 50; i++) {
reverse(idk[i].begin(),idk[i].end());
}
dp[0].push_back(0);
long long p = -1;
for(long long i = 0; i < 50; i++) {
if(br[i+1] == -1) {
p = i;
break;
}
long long c = (m%br[i+1])/br[i];
long long d = br[i+1]/br[i];
long long a = 0,b = 0,sb = dp[i][0];
while(a+b < c && (a+1 < dp[i].size() || b < idk[i].size())) {
if(a+1 < dp[i].size() && (b == idk[i].size() || (dp[i][a+1]-dp[i][a] > idk[i][b]))) {
sb+=dp[i][a+1]-dp[i][a];
a++;
}
else {
sb+=idk[i][b];
b++;
}
}
dp[i+1].push_back(sb);
while((a+1 < dp[i].size() || b < idk[i].size())) {
if(a+1 < dp[i].size() && (b == idk[i].size() || (dp[i][a+1]-dp[i][a] > idk[i][b]))) {
sb+=dp[i][a+1]-dp[i][a];
a++;
}
else {
sb+=idk[i][b];
b++;
}
if((a+b-c)%d == 0) {
dp[i+1].push_back(sb);
}
}
dp[i+1].push_back(sb);
}
long long ans = dp[p][0];
vector<long long> yo(0);
for(long long i = 1; i < dp[p].size(); i++) {
yo.push_back(dp[p][i]-dp[p][i-1]);
}
for(long long v: idk[p]) {
yo.push_back(v);
}
sort(yo.begin(),yo.end());
reverse(yo.begin(),yo.end());
long long x = min((long long)yo.size(),m/br[p]);
for(long long i = 0; i < x; i++) {
ans+=yo[i];
}
cout << ans;
return 0;
}