#include<bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(int i = (a); i < (b); ++i)
#define per(i, a, b) for(int i = (a); i >= (b); --i)
#define trav(a, x) for(auto& a : x)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<double,double> pdd;
typedef vector<int> vi;
typedef vector<ll> vll;

const ll INF = LLONG_MAX;
//const int INF = 1e9;
const ll mod=1000000007;
const double pi = 3.14159265358979323846;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b ? gcd(b,a%b) : a;}
int x[2000010];
int y[2000010];

void intersect(double ax, double ay, double bx, double by, double cx, double cy, int dx, int dy, double& x, double &y)
{ 
    // Line AB represented as a1x + b1y = c1 
    double a1 = by - ay; 
    double b1 = ax - bx; 
    double c1 = a1*ax + b1*ay; 
  
    // Line CD represented as a2x + b2y = c2 
    double a2 = dy - cy; 
    double b2 = cx - dx; 
    double c2 = a2*cx+ b2*cy; 
  
    double determinant = a1*b2 - a2*b1; 
  
    if (determinant == 0) 
    { 
        return;
    } 
    else
    { 
        x = (b2*c1 - b1*c2)/determinant; 
        y = (a1*c2 - a2*c1)/determinant; 
        return;
    } 
} 

double getDist(double ax, double ay, double bx, double by)
{
    return sqrt((ax - bx)*(ax - bx)
                + (ay - by)*(ay - by));
}

double getSlope(double ax, double ay, double bx, double by)
{
    return ((by - ay))/((bx - ax));
}

void solve()
{
    int n; int H;
    cin >> n >> H;
    rep(i,0,n)
    {
        int t1,t2;
        cin >> t1 >> t2;
        x[i] = t1; 
        y[i] = t2;
    }
    double eyex = x[n-1];
    double eyey = y[n-1]+H;
    double res = 0;
    vector<double> slopes(n);
    rep(i,0,n-1) slopes[i] = getSlope(x[i],y[i],eyex,eyey);
    //rep(i,0,n-1) cout << slopes[i] << " ";
    //cout << endl;
    int highest = -1;
    double slope1;
    for(int i = n-2;i>=1;i--)
    {
        if (highest == -1 || slopes[i] < slopes[highest]) 
        {
            highest = i;
            slope1 = slopes[highest];
        }
        // slope1: eye to intersect
        // slope2: eye to starting point
        double slope2 = slopes[i-1];
        //if (i == 1) cout << " "<< slope1 << " " << slope2 << endl;
        if (slope1 < slope2) continue;
        if (slope1 == slope2)
        {
            double s = slopes[i];
            if (s != slope1) continue;  
        } 
        double X = x[i];
        double Y = y[i];
        if (slope1 > slope2) 
        {
            intersect(x[i-1],y[i-1],x[i],y[i],x[highest],y[highest],eyex,eyey,X,Y);
            if (X > x[i]) X = x[i];
        }

        res += getDist(X,Y,x[i-1],y[i-1]);
       // cout << i << ": " << res << endl;
      //  cout << X << " " << Y << endl;
    }
    res += getDist(x[n-2],y[n-2],x[n-1],y[n-1]);
    cout << fixed << setprecision(10) << res << endl;
}  

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    solve();
    return 0;
}



 