#include <bits/stdc++.h>
using namespace std;
long long b[4][400000];
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> v[4];
  int id[4] = {0};
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
  }
  for (int i = 0; i < 4; i++) {
    sort(v[i].begin(), v[i].end());
    id[i] = (int)v[i].size() - 1;
  }
  memset(b, 0, sizeof(b));
  int h = id[3];
  for (int i = 1; i < 400000; i++) {
    if (h >= 0) {
      b[3][i] += v[3][h];
      h--;
    }
    if (i > 0) b[3][i] += b[3][i - 1];
  }
  h = id[2];
  for (int i = 1; i < 400000; i++) {
    if (h >= 0) {
      b[2][i] += v[2][h];
      h--;
    }
    if (i > 0) b[2][i] += b[2][i - 1];
  }
  h = id[1];
  for (int i = 1; i < 400000; i++) {
    if (h >= 0) {
      b[1][i] += v[1][h];
      h--;
    }
    if (i > 0) b[1][i] += b[1][i - 1];
  }
  long long maxx = 0;
  long long PL = 0;
  for (int i = 0; i <= v[3].size(); i++) {
    int t = m;
    t -= i * 3;
    if (t < 0) break;
    long long ans = b[3][i];
    int st = 0, En = min((int)v[2].size(), t / 2);
    while ((En - st) >= 3) {
      int step = (En - st) / 3;
      int mid1 = (st + step);
      int mid2 = (En - step);
      int C1 = 0, C2 = 0;
      C1 = t - mid1 * 2;
      C2 = t - mid2 * 2;
      long long EE1 = b[2][mid1];
      EE1 += (b[1][C1]);
      long long EE2 = b[2][mid2];
      EE2 += (b[1][C2]);
      if (EE1 < EE2) {
        st = mid1;
      } else
        En = mid2;
    }
    long long F1 = 0, F2 = 0, F3 = 0;
    F1 = b[2][st] + b[1][t - st * 2];
    F2 = b[2][En] + b[1][t - En * 2];
    if (En - st == 2) F3 = b[2][st + 1] + b[1][t - (st + 1) * 2];
    long long sum = max(F1, max(F2, F3));
    sum += ans;
    maxx = max(maxx, sum);
  }
  cout << maxx;
}
