#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-3;
inline int dcmp(double x)
{
    if(fabs(x) < eps) return 0;
    else return x < 0 ? -1 : 1;
}
struct Point
{
    double x, y;
    Point(double x=0, double y=0):x(x),y(y) { }
    inline void read()
    {
        scanf("%lf%lf", &x, &y);
    }
};
typedef vector<Point> Polygon;
typedef Point Vector;

inline Vector operator + (Vector A, Vector B)
{
    return Vector(A.x+B.x, A.y+B.y);
}
inline Vector operator - (Point A, Point B)
{
    return Vector(A.x-B.x, A.y-B.y);
}
inline Vector operator * (Vector A, double p)
{
    return Vector(A.x*p, A.y*p);
}
inline Vector operator / (Vector A, double p)
{
    return Vector(A.x/p, A.y/p);
}
inline bool operator < (Point a, Point b)
{
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}


inline bool operator == (Point a, Point b)
{
    return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
}


inline double Dot(Vector A, Vector B)
{
    return A.x*B.x + A.y*B.y;
}
inline double Length(Vector A)
{
    return sqrt(Dot(A, A));
}
inline double Angle(Vector A, Vector B)
{
    return acos(Dot(A, B) / Length(A) / Length(B));
}
inline double angle(Vector v)
{
    return atan2(v.y, v.x);
}
inline double Cross(Vector A, Vector B)
{
    return A.x*B.y - A.y*B.x;
}
inline Vector Unit(Vector x)
{
    return x / Length(x);
}
inline Vector Normal(Vector x)
{
    return Point(-x.y, x.x) / Length(x);
}
inline Vector Rotate(Vector A, double rad)
{
    return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));
}
inline double Area2(Point A, Point B, Point C)
{
    return Cross(B-A, C-A);
}
template <class T> T sqr(T x)
{
    return x * x ;
}
Point GetLineIntersection(Point p, Vector v, Point q, Vector w)
{
    Vector u = p-q;
    double t = Cross(w, p - q) / Cross(v, w);
    return p + v*t;
}
#define maxn 200005
int n;
Point a[maxn],O;
double H;
int main()
{
	scanf("%d%lf",&n,&H);
	for(int i=1;i<=n;++i)
	{
		scanf("%lf%lf",&a[i].x,&a[i].y);
	}
	O=Point(a[n].x,a[n].y+H);
	Point lst=a[n];
	double ans=0;
	for(int i=n-1;i>=1;--i)
	{
		if(dcmp(Cross(lst-O,a[i]-O))<0)
		{
			Point p=GetLineIntersection(a[i+1],a[i+1]-a[i],O,O-lst);
			ans+=Length(a[i]-p);
			lst=a[i];
		}
		else if(dcmp(Cross(lst-O,a[i]-O))==0)
		{
			if(dcmp(Cross(lst-O,a[i]-a[i+1]))==0)ans+=Length(a[i]-a[i+1]);
			lst=a[i];
		}
	}
	printf("%.10f\n",ans);
}
