#include<bits/stdc++.h>      using namespace :: std;      #define ll long long   #define mp make_pair   #define ld long double   #define F first   #define S second   #define pii pair<int,int>   #define pb push_back      const int maxn=2e5+500;   const int inf=1e9+900;   const int mod=1e9+7;      pair<int,int> tip,che;      ld lenght(pair<ld,ld> a){    return sqrt(a.F*a.F+a.S*a.S);   }   bool mibin(pair<ld,ld> x){     complex<ld> a,b;     a.real(((ld)(che.F)-(x.F)));     a.imag(((ld)(che.S)-(x.S)));     b.real(((ld)(che.F)-(tip.F)));     b.imag(((ld)(che.S)-(tip.S)));     a*=-1;     b*=-1;     if(arg(a)<=0 && arg(b)<=0){      return (arg(a)<=arg(b));     }     if(arg(a)>=0 && arg(b)>=0){      return (arg(a)<=arg(b));     }     if(arg(a)>=0 && arg(b)<=0){      return 1;     }     if(arg(a)<=0 && arg(b)>=0){      return 0;     }     return (arg(a)<=arg(b));   }      void add(pair<int,int> x){    if(mibin(mp((ld)x.F,(ld)x.S))){     tip=x;    }   }   ld mibine(pair<int,int> s,pair<int,int> t){    pair<int,int> v=mp(t.F-s.F,t.S-s.S);    if(!mibin(s)){    // cout<< NOting n ;     return 0;    }    if(mibin(t)){    // cout<< ALL n ;     return lenght(v);    }    ld b=0;    ld e=1;    for(int i=0;i<60;i++){     ld mid=(e+b)/2;     if(mibin(mp((s.F)+mid*(v.F),(s.S)+mid*(v.S)))){      b=mid;     }else{      e=mid;     }    }   // cout<<b<<endl;    return lenght(v)*b;   }         int x[maxn];   int y[maxn];         int main(){    ios_base::sync_with_stdio(false);    cin.tie(0);       int n,h;    cin>>n>>h;    for(int i=0;i<n;i++){     cin>>x[i]>>y[i];    }    ld ans=lenght(mp(x[n-1]-x[n-2],y[n-1]-y[n-2]));    tip=mp(x[n-2],y[n-2]);    che=mp(x[n-1],y[n-1]+h);    for(int i=n-3;i>=0;i--){     add(mp(x[i+1],y[i+1]));     ans+=mibine(mp(x[i],y[i]),mp(x[i+1],y[i+1]));    }    cout<<fixed<<setprecision(10)<<ans;   }   