#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
double A=clock();
#define setIO(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define closefile fclose(stdin),fclose(stdout)
#define see(x) cerr<<x<<" "
#define seeln(x) cerr<<x<<endl
#define out(x) cerr<<#x<<" = "<<x<<" "
#define outln(x) cerr<<#x<<" = "<<x<<endl
#define outarr(x,l,r) {cerr<<#x"["<<l<<"-"<<r<<"] = "; for (int _i=l;_i<=r;++_i) cerr<<x[_i]<<" "; cerr<<endl;}
#define user_time cerr<<fixed<<setprecision(6)<<(clock()-A)*1.0/CLOCKS_PER_SEC<<endl
#define m_p make_pair
#define sz(x) (int)x.size()
template <class T> void read(T &x)
{
	x=0; char c=getchar(); int flag=0;
	while (c<'0'||c>'9') flag|=(c=='-'),c=getchar();
	while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	if (flag) x=-x;
}
template <class T> T _max(T a,T b){return b>a ? b : a;}
template <class T> T _min(T a,T b){return b<a ? b : a;}
template <class T> bool checkmax(T &a,T b){return b>a ? a=b,1 : 0;}
template <class T> bool checkmin(T &a,T b){return b<a ? a=b,1 : 0;}
const int N=200005;
const double pi=acos(-1.0),eps=1e-9,inf=1e20;
int n,H;
int sgn(double x){return fabs(x)<eps ? 0 : (x>0 ? 1 : -1);}
int dcmp(double a,double b){return sgn(a-b);}
struct Point
{
	double x,y;
	Point(double _x=0,double _y=0):x(_x),y(_y){}
}a[N];
typedef Point Vector;
double sqr(double x){return x*x;}
double dist(Point a,Point b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
bool operator < (Vector a,Vector b){return a.x!=b.x ? a.x<b.x : a.y<b.y;}
bool operator == (Vector a,Vector b){return dcmp(a.x,b.x)==0&&dcmp(a.y,b.y)==0;}
Vector operator + (Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector operator - (Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector operator * (Vector a,double b){return Vector(a.x*b,a.y*b);}
Vector operator / (Vector a,double b){return Vector(a.x/b,a.y/b);}
double operator ^ (Vector a,Vector b){return a.x*b.x+a.y*b.y;}
double operator * (Vector a,Vector b){return a.x*b.y-a.y*b.x;}
double Length(Vector a){return sqrt(a^a);}
double Angle(Vector a,Vector b){return acos(a^b/Length(a)/Length(b));}
Vector Rotate(Vector a,double rad){return Vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));}
Point Line_intersection(Point p1,Vector v1,Point p2,Vector v2)
{
	//if (sgn(v1*v2)==0) return Point(-inf,-inf);
	double t=((p2-p1)*v2)/(v1*v2);
	return p1+v1*t;
}

void init()
{
	read(n); read(H);
	for (int i=1,x,y;i<=n;++i) 
	{
		read(x),read(y);
		a[i]=Point((double)x,(double)y);
	}
}

void solve()
{
	Point Eye=Point(a[n].x,a[n].y+H);
	Point M=a[n];
	double ans=0;
	for (int i=n-1;i>=1;--i)
	{
		Point L=a[i],R=a[i+1];
		int seeL=1,seeR=1;
		if (sgn((M-Eye)*(L-Eye))>0) seeL=0;
		if (sgn((M-Eye)*(R-Eye))>0) seeR=0;
		if (!seeL) continue;
		if (seeR) ans+=dist(L,R);
		else
		{
			Point P=Line_intersection(L,R-L,Eye,M-Eye);
			ans+=dist(L,P);
		}
		M=a[i];
	}
	printf("%.10lf\n",ans);
}

int main()
{
	//setIO("");
	init();
	solve();
	closefile;
	return 0;
}
