#include<bits/stdc++.h>
using namespace std;
typedef long long int64;
typedef pair< int, int > Pi;
 
const int INF = 1 << 30;
// 区間への加算, 最大値が求まればいいかんじに出来る
 
int64 seg[1 << 18], added[1 << 18];
 
inline void add( int a, int b, int64 value, int k = 0, int l = 0, int r = 1 << 17){ // [a,b)にvalueを足すやつ
  if(r <= a || b <= l) return;
  if(a <= l && r <= b) { // 完全に含んでたら足す
    added[k] += value;
  } else {
    int mid = (l + r) >> 1;
    add( a, b, value, 2 * k + 1, l, mid);
    add( a, b, value, 2 * k + 2, mid, r);
    seg[k] = max( seg[2 * k + 1] + added[2 * k + 1], seg[2 * k + 2] + added[2 * k + 2]);
  }
  return;
}
 
inline int64 query( int a, int b, int k = 0, int l = 0, int r = 1 << 17){ // [a,b)の最大値を返すやつ
  if(r <= a || b <= l) return -INF;
  if(a <= l && r <= b) return seg[k] + added[k];
  int mid = (l + r) >> 1;
  return max( query( a, b, 2 * k + 1, l, mid), query( a, b, 2 * k + 2, mid, r)) + added[k];
}
 
 
 int main()
 {
   int N, H;
   int64 life = 0; // 今の体力
   int64 ret = 0;
 
   scanf("%d %d", &N, &H);
   life = H;
   priority_queue< Pi > que; // first: 一回あたりの回復体力量, second: どこ
   for(int i = 0; i < N - 1; i++){
     add( i, i + 1, life); // 今の体力を更新
     int d, h;
     scanf("%d %d", &d, &h);
     que.push( Pi( h, i));
 
     life -= d; // 降りる
     while(life <= 0){
       Pi p = que.top(); que.pop();
       int64 lange = query( p.second, i + 1); // 回復量の最大値
       if(p.first + lange > H)  {
         que.push( Pi( H - lange, p.second));
       } else {
         int64 cnt = min((H - lange) / p.first, -life / p.first + 1LL); // 回復量の最大値 OR lifeまでの回復量
         ret += cnt;
         life += cnt * p.first;
         add( p.second, i + 1, cnt * p.first);
         que.push(p);
       }
     }
   }
   printf("%lld\n", ret);
}