#include<bits/stdc++.h> 
using namespace std;
namespace Sakurajima_Mai{
	#define ms(a) memset(a,0,sizeof(a))
	#define repi(i,a,b) for(int i=a,bbb=b;i<=bbb;++i)//attention reg int or reg ll ?
	#define repd(i,a,b) for(int i=a,bbb=b;i>=bbb;--i)
	#define reps(s) for(int i=head[s],v=e[i].to;i;i=e[i].nxt,v=e[i].to)
	#define ce(i,r) i==r?'\n':' '
	#define pb push_back 
	#define all(x) x.begin(),x.end()
	#define gmn(a,b) a=min(a,b)
	#define gmx(a,b) a=max(a,b)
	#define fi first
	#define se second   					  
	typedef long long ll;
	typedef unsigned long long ull;
	typedef double db;
	const int infi=2e9;//infi??,????inf????int
	const ll infl=4e18;
	inline ll ceil_div(ll a,ll b){ return (a+b-1)/b; }
	//std::mt19937 rnd(time(0));//std::mt19937_64 rnd(time(0));
}
using namespace Sakurajima_Mai;
namespace Fast_Read{
	inline int qi(){
	    int f=0,fu=1; char c=getchar();
	    while(c<'0'||c>'9'){ if(c=='-')fu=-1; c=getchar(); }
	    while(c>='0'&&c<='9'){ f=(f<<3)+(f<<1)+c-48; c=getchar(); }
	    return f*fu;
	}
	inline ll ql(){
		ll f=0;int fu=1; char c=getchar();
	    while(c<'0'||c>'9'){ if(c=='-')fu=-1; c=getchar(); }
	    while(c>='0'&&c<='9'){ f=(f<<3)+(f<<1)+c-48; c=getchar(); }
	    return f*fu;
	}
	inline db qd(){
	    char c=getchar();int flag=1;double ans=0;
	    while((!(c>='0'&&c<='9'))&&c!='-') c=getchar();
	    if(c=='-') flag=-1,c=getchar();
	    while(c>='0'&&c<='9') ans=ans*10+(c^48),c=getchar();
	    if(c=='.'){c=getchar();for(int Bit=10;c>='0'&&c<='9';Bit=(Bit<<3)+(Bit<<1)) ans+=(double)(c^48)*1.0/Bit,c=getchar();}
	    return ans*flag;
	}
}
namespace Read{
	#define si(a) scanf("%d",&a)
	#define sl(a) scanf("%lld",&a)
	#define sd(a) scanf("%lf",&a)
	#define ss(a) scanf("%s",a)
	#define rai(x,a,b) repi(i,a,b) x[i]=qi()
	#define ral(x,a,b) repi(i,a,b) x[i]=ql()
}
namespace Out{
	#define pi(x) printf("%d",x)
	#define pl(x) printf("%lld",x)
	#define ps(x) printf("%s",x)
	#define pc(x) printf("%c",x)
	#define pe() puts("")
}
namespace DeBug{
	#define MARK false
	#define DB if(MARK) 
	#define pr(x) cout<<#x<<": "<<x<<endl
	#define pra(x,a,b) cout<<#x<<": "<<endl; \
			repi(i,a,b) cout<<x[i]<<" ";	 \
			puts("");   
	#define FR(a) freopen(a,"r",stdin)
	#define FO(a) freopen(a,"w",stdout)
}
using namespace Fast_Read;
using namespace Read;
using namespace Out;
using namespace DeBug;
const int MAX_N=2e5+5;
const db pi=acos(-1.0);
const db eps=1e-10;
inline int sgn(db x){ return fabs(x)<eps?0:(x<0?-1:1); }
struct Point{
	db x,y;
	Point(){}
	Point(db _x,db _y){x=_x,y=_y;}
	void input(){sd(x),sd(y);} 
	bool operator ==(Point b)const{return sgn(x-b.x)==0&&sgn(y-b.y)==0;}
	Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}
	Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}
	Point operator /(const db b)const{return Point(x/b,y/b);}
    Point operator *(const db b)const{return Point(x*b,y*b);}
    db operator ^(const Point &b)const{return x*b.y-y*b.x;}//²æ³Ë
	db operator *(const Point &b)const{return x*b.x+y*b.y;}//µã³Ë
	db dis(Point p){ return sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)); }//hypot(x-p.x,y-p.y)
}p[MAX_N];
struct Line{
	Point s,e;
	Line(){}
	Line(Point _s,Point _e){ s=_s,e=_e; }
	pair<int,Point> operator &(const Line &b)const
	{
		Point res=s;
		if(sgn((s-e)^(b.s-b.e))==0){
			if(sgn((s-b.e)^(b.s-b.e))==0) return make_pair(0,res);
			else return make_pair(1,res);
		}
		db t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
		res.x+=(e.x-s.x)*t,res.y+=(e.y-s.y)*t;
		return make_pair(2,res);
	}
};
bool Seg_inter_Line(Line l1,Line l2)//??l2?????????l1??
{  
	return sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e))<=0;
} 
db Get_K(int i,int j){ return (p[j].y-p[i].y)/(p[j].x-p[i].x); }
int main()
{
	int n=qi(),h=qi();
	repi(i,1,n) p[i].input();
	p[n+1]=p[n]; p[n+1].y+=h;
	db ans=p[n].dis(p[n-1]),k=Get_K(n+1,n-1);
	Line sight(p[n+1],p[n-1]);
	bool see=true;
	repd(i,n-1,2){
		db nk=Get_K(i-1,i);
		if(see){
			if(sgn(nk-k)>0) see=false;
			else ans+=p[i].dis(p[i-1]),k=Get_K(i-1,n+1),sight=Line(p[n+1],p[i-1]);
		}
		else{
			if(sgn(nk-k)>0) continue;
			else{
				Line road(p[i],p[i-1]);
				if(!Seg_inter_Line(sight,road)) continue;
				see=true;
				ans+=(sight&road).se.dis(p[i-1]);
				k=Get_K(i-1,n+1),sight=Line(p[n+1],p[i-1]);
			}			
		}
	}	
	printf("%.10lf\n",ans);
	return 0;
}
