#include <bits/stdc++.h>
using namespace std;
namespace Base {
const int inf = 0x3f3f3f3f, INF = 0x7fffffff;
const long long infll = 0x3f3f3f3f3f3f3f3fll, INFll = 0x7fffffffffffffffll;
template <typename T>
void read(T &x) {
  x = 0;
  int fh = 1;
  double num = 1.0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  if (ch == '.') {
    ch = getchar();
    while (isdigit(ch)) {
      num /= 10;
      x = x + num * (ch - '0');
      ch = getchar();
    }
  }
  x = x * fh;
}
template <typename T>
void chmax(T &x, T y) {
  x = x < y ? y : x;
}
template <typename T>
void chmin(T &x, T y) {
  x = x > y ? y : x;
}
}  // namespace Base
using namespace Base;
const int N = 200010;
struct Node {
  long long c;
  int v;
} p[N], d[N];
bool cmp(Node x, Node y) { return ((x.v < y.v) || (x.v == y.v && x.c < y.c)); }
int n;
long long dl[N], dr[N];
long long s;
int main() {
  read(n);
  read(s);
  for (int i = 1; i <= n; i++) {
    read(p[i].v);
    read(p[i].c);
  }
  sort(p + 1, p + n + 1, cmp);
  int cnt = 1;
  for (int i = 2; i <= n; i++)
    if (p[i].v != p[cnt].v) p[++cnt] = p[i];
  n = cnt;
  for (int i = n - 1; i >= 1; i--)
    if (p[i].c < p[cnt].c) p[--cnt] = p[i];
  for (int i = cnt; i <= n; i++) p[i - cnt + 1] = p[i];
  assert(p[1].c == 0);
  n = n - cnt + 1;
  cnt = 1;
  d[1].c = 0;
  d[1].v = p[1].v;
  dl[1] = 1;
  dr[1] = infll;
  for (int i = 2; i <= n; i++) {
    int l = 1, r = cnt, q;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (dr[mid] == infll || p[i].c <= d[mid].c + d[mid].v * dr[mid])
        q = mid, r = mid - 1;
      else
        l = mid + 1;
    }
    long long dat;
    if (d[q].c >= p[i].c)
      dat = 0;
    else
      dat = (p[i].c - d[q].c - 1) / d[q].v + 1;
    Node now = (Node){d[q].c + d[q].v * dat - p[i].c - p[i].v * dat, p[i].v};
    l = 1, r = cnt;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (dr[mid] == infll ||
          now.c + now.v * dr[mid] >= d[mid].c + d[mid].v * dr[mid])
        q = mid, r = mid - 1;
      else
        l = mid + 1;
    }
    long long ti = (d[q].c - now.c - 1) / (now.v - d[q].v) + 1;
    if (ti <= dl[q])
      cnt = q - 1, ti = dl[q];
    else
      cnt = q;
    d[++cnt] = now;
    dl[cnt] = ti, dr[cnt] = infll;
    dr[cnt - 1] = dl[cnt] - 1;
  }
  long long ans = 0;
  for (int i = 1; i <= cnt; i++)
    if (dr[i] == infll || d[i].c + d[i].v * dr[i] >= s) {
      ans = (s - d[i].c - 1) / d[i].v + 1;
      break;
    }
  for (int i = 1; i < cnt; i++) {
    assert(d[i].c + dr[i] * d[i].v > d[i + 1].c + dr[i] * d[i + 1].v);
    assert(d[i].c + (dr[i] + 1) * d[i].v <=
           d[i + 1].c + (dr[i] + 1) * d[i + 1].v);
  }
  printf("%lld\n", ans);
  return 0;
}
