You have N items that you want to put them into a knapsack. Item i has value vi and weight wi.

You want to find a subset of items to put such that:

* The total value of the items is as large as possible.
* The items have combined weight at most W, that is capacity of the knapsack.



Find the maximum total value of items in the knapsack.

Constraints

* 1 ≤ N ≤ 40
* 1 ≤ vi ≤ 1015
* 1 ≤ wi ≤ 1015
* 1 ≤ W ≤ 1015

Input


N W
v1 w1
v2 w2
:
vN wN


The first line consists of the integers N and W. In the following N lines, the value and weight of the i-th item are given.

Output

Print the maximum total values of the items in a line.

Examples

Input

4 5
4 2
5 2
2 1
8 3


Output

13


Input

2 20
5 9
4 10


Output

9
#include<bits/stdc++.h>
using namespace std;
using Int = long long;

template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE
signed main(){
  Int n,k;
  cin>>n>>k;
  vector<Int> v(n),w(n);
  for(Int i=0;i<n;i++) cin>>v[i]>>w[i];

  if(n<=20){
    Int ans=0;
    for(Int b=0;b<(1<<n);b++){
      Int tmp=0,res=0;
      for(Int i=0;i<n;i++)
	if((b>>i)&1) tmp+=w[i],res+=v[i];
      if(tmp<=k) chmax(ans,res);
    }  
    cout<<ans<<endl;
    return 0;
  }

  Int ans=0;
  using P = pair<Int, Int>;
  vector<P> vp;
  Int h=20,r=n-h;
  for(Int b=0;b<(1<<h);b++){
    Int tmp=0,res=0;
    for(Int i=0;i<h;i++)
      if((b>>i)&1) tmp+=w[i],res+=v[i];
    if(tmp>k) continue;
    vp.emplace_back(tmp,res);
  }
  sort(vp.begin(),vp.end());
  
  vector<P> up;
  for(P p:vp)
    if(up.empty()||up.back().second<p.second)
      up.emplace_back(p);
  
  for(Int b=0;b<(1<<r);b++){
    Int tmp=0,res=0;
    for(Int i=0;i<r;i++)
      if((b>>i)&1) tmp+=w[h+i],res+=v[h+i];
    if(tmp>k) continue;
    chmax(ans,res);
    auto latte=--upper_bound(up.begin(),up.end(),P(k-tmp+1,-1));
    if(tmp+latte->first<=k) chmax(ans,res+latte->second);
    
    //cout<<tmp<<" "<<res<<":"<<latte->first<<" "<<latte->second<<endl;
  }
  cout<<ans<<endl;
  return 0;
}

