#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int T,n,m;
struct zjy{
int w,v;
}s[105];
vector<int> G[55],Q[55];
int t,tot,num;
ll f[55][5010],g[55][5010],ans;
int main(){
while(1){
ans=0;
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
for(int i=0;i<=50;++i){
G[i].clear(),Q[i].clear();
}
n=read(),m=read();
if(n==-1&&m==-1){
break;
}
for(int i=1;i<=n;++i){
s[i].v=read(),s[i].w=read();
t=s[i].v,tot=0;
while(((t>>tot)&1)==0){
++tot;
}
G[tot].push_back((t>>tot));
Q[tot].push_back(s[i].w);
}
num=0;
while((m>>num)){
++num;
}
for(int i=0;i<=num;++i){
for(int j=0;j<G[i].size();++j){
for(int k=500;k>=G[i][j];--k){
f[i][k]=max(f[i][k],f[i][k-G[i][j]]+Q[i][j]);
}
}
}
for(int i=0;i<=num;++i){
for(int j=500;j>=0;--j){
for(int k=0;k<=j;++k){
g[i][j]=max(g[i][j],g[i-1][k*2+((m>>(i-1))&1)]+f[i][j-k]);
}
//ans=max(ans,g[i][j]);
}
}
printf("%lld\n",g[num-1][1]);
}
return 0;
}