#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int maxn = 2e5 + 10;
struct build {
  long long c, v;
  bool operator<(const build &p) const {
    return c < p.c || (c == p.c && v > p.v);
  }
} a[maxn];
vector<long long> m, b;
int n, ptr;
long long s;
long long f(int i, long long x) { return m[i] * x + b[i]; }
long long get(int i, long long c) { return (c - b[i] + m[i] - 1) / m[i]; }
bool bad(int l1, int l2, int l3) {
  return 1.0 * (b[l3] - b[l1]) * (m[l1] - m[l2]) <=
         1.0 * (b[l2] - b[l1]) * (m[l1] - m[l3]);
}
int main(int argc, char const *argv[]) {
  scanf("%d %lld", &n, &s);
  for (int i = 0; i < n; i++) scanf("%lld %lld", &a[i].v, &a[i].c);
  sort(a, a + n);
  m.push_back(a[0].v);
  b.push_back(a[0].c);
  long long mx = 0, ans = get(0, s);
  for (int i = 1; i < n; i++) {
    if (a[i].v <= mx) continue;
    mx = a[i].v;
    while (ptr < m.size() - 1) {
      long long t1 = get(ptr, a[i].c), t2 = get(ptr + 1, a[i].c);
      if (t1 > t2 || (t1 == t2 && f(ptr, t1) < f(ptr + 1, t2)))
        ++ptr;
      else
        break;
    }
    long long t = get(ptr, a[i].c);
    long long _m = a[i].v, _b = f(ptr, t) - a[i].c - a[i].v * t;
    m.push_back(_m);
    b.push_back(_b);
    int sz = m.size();
    while (sz >= 3 && bad(sz - 3, sz - 2, sz - 1)) {
      m.erase(m.end() - 2);
      b.erase(b.end() - 2);
      sz--;
    }
    ans = min(ans, get(m.size() - 1, s));
  }
  printf("%lld\n", ans);
}
