#include <bits/stdc++.h>
using namespace std;
struct Line {
  long long k, b;
  long long calc(long long x) { return k * x + b; }
} L[200010];
int N;
long long query(long long x) {
  int l = 1, r = N + 1;
  while (l + 1 < r) {
    int mid = (l + r) >> 1;
    if (L[mid - 1].calc(x) < L[mid].calc(x))
      l = mid;
    else
      r = mid;
  }
  return L[l].calc(x);
}
long long solve(long long to) {
  long long l = 0, r = (to - L[N].b) / L[N].k + 10000;
  while (l + 1 < r) {
    long long mid = (l + r) >> 1;
    if (query(mid) >= to)
      r = mid;
    else
      l = mid;
  }
  return r;
}
long long getpos(Line x, Line y) {
  long long dk = y.k - x.k;
  long long db = x.b - y.b;
  return (db + dk - 1) / dk;
}
void insert(Line x) {
  while (N > 1 && getpos(L[N], x) <= getpos(L[N - 1], L[N])) N--;
  L[++N] = x;
  return;
}
struct Val {
  int v, c;
} a[200010];
bool cmp(Val x, Val y) { return x.c < y.c; }
int main() {
  int n;
  long long s;
  scanf("%d %I64d", &n, &s);
  for (int i = 1; i <= n; i++) scanf("%d %d", &a[i].v, &a[i].c);
  sort(a + 1, a + n + 1, cmp);
  int mxv = 0;
  for (int i = 1; i <= n; i++) {
    if (a[i].v <= mxv) continue;
    mxv = a[i].v;
    if (a[i].c == 0) {
      N = 1;
      L[1].k = a[i].v;
      L[1].b = 0;
    } else {
      long long t = solve(a[i].c);
      long long val = query(t);
      Line x;
      x.k = a[i].v;
      x.b = val - a[i].c - a[i].v * t;
      insert(x);
    }
  }
  printf("%I64d\n", solve(s));
  return 0;
}
