#include <bits/stdc++.h>
using namespace std;
long long INF = 1LL << 62;
struct building {
  int v, c;
  bool operator<(const building &r) const {
    return c == r.c ? v > r.v : (c < r.c);
  }
  void get() { scanf("%d%d", &v, &c); }
} bd[112345 * 2];
struct pt {
  long long t0, m, fm;
  int v;
  long long gao(long long M) const {
    if (v == 0) {
      assert(M == m);
      return t0;
    }
    return ((M - m) + v - 1) / v + t0;
  }
  void update(long long t) {
    m += (t - t0) * v;
    t0 = t;
  }
  long long operator-(const pt &r) const {
    assert(v > r.v);
    return (r.m - r.t0 * r.v + t0 * v - m + v - r.v - 1) / (v - r.v);
  }
  pt operator+(const building &b) const {
    pt r;
    r.t0 = gao(b.c);
    r.m = m + (r.t0 - t0) * v - b.c;
    r.v = b.v;
    r.fm = INF;
    return r;
  }
} q[112345 * 2];
bool ok(int x, const pt &p) { return (q[x].t0 - p.t0) * p.v + p.m >= q[x].m; }
int tot = 0, curr = 0;
int main() {
  int n;
  long long s;
  cin >> n >> s;
  INF = s;
  for (int i = 0; i < int(n); i++) bd[i].get();
  sort(bd, bd + n);
  int tn = 0;
  for (int i = 1; i < n; i++) {
    if (bd[i].c == bd[i - 1].c)
      continue;
    else if (bd[i].v > bd[tn].v)
      bd[++tn] = bd[i];
  }
  n = tn + 1;
  q[0].t0 = q[0].m = q[0].fm = q[0].v = 0;
  tot = 1;
  long long ans = INF;
  for (int i = 0; i < int(n); i++) {
    while (curr < tot && q[curr].fm < bd[i].c) curr++;
    if (curr == tot) break;
    int l = curr, r = tot;
    pt now = q[curr] + bd[i];
    while (l < r) {
      int m = (l + r) / 2;
      if (ok(m, now))
        r = m;
      else
        l = m + 1;
    }
    q[l] = now;
    if (l) {
      long long et = q[l] - q[l - 1];
      q[l - 1].fm = (et - 1 - q[l - 1].t0) * q[l - 1].v + q[l - 1].m;
      q[l].update(et);
    }
    ans = min(ans, q[l].gao(s));
    tot = l + 1;
  }
  cout << ans << endl;
}
