#include <bits/stdc++.h>
using namespace std;
pair<long double, long double> P[100000 + 5];
bool In[100000 + 5];
int Convex[100000 + 5];
int Circle[100000 + 5];
int H, T, Lc;
long double r;
int N;
pair<long double, long double> operator+(pair<long double, long double> A,
                                         pair<long double, long double> B) {
  return pair<long double, long double>(A.first + B.first, A.second + B.second);
}
pair<long double, long double> operator-(pair<long double, long double> A,
                                         pair<long double, long double> B) {
  return pair<long double, long double>(A.first - B.first, A.second - B.second);
}
pair<long double, long double> operator*(pair<long double, long double> A,
                                         long double B) {
  return pair<long double, long double>(A.first * B, A.second * B);
}
pair<long double, long double> operator/(pair<long double, long double> A,
                                         long double B) {
  return pair<long double, long double>(A.first / B, A.second / B);
}
long double MySqrt(long double A) {
  if (A <= 1e-6) return 0;
  return sqrt(A);
}
long double Mode2(pair<long double, long double> A) {
  return MySqrt(A.first * A.first + A.second * A.second);
}
long double operator^(pair<long double, long double> A,
                      pair<long double, long double> B) {
  return A.first * B.second - A.second * B.first;
}
bool Cross(pair<long double, long double> A, pair<long double, long double> B,
           pair<long double, long double> C) {
  return ((B - A) ^ (C - A)) <= 0;
}
pair<long double, long double> GetO(pair<long double, long double> A,
                                    pair<long double, long double> B) {
  pair<long double, long double> Vy(A.second - B.second, B.first - A.first);
  long double M = Mode2(Vy);
  Vy = Vy / M * MySqrt(r * r - M * M / 4);
  pair<long double, long double> O = (A + B) / 2 + Vy;
  return O;
}
bool InCircle(pair<long double, long double> A,
              pair<long double, long double> B,
              pair<long double, long double> C) {
  pair<long double, long double> O = GetO(A, C);
  return Mode2(O - B) < r + 1e-6;
}
long double GetAns(pair<long double, long double> A,
                   pair<long double, long double> B) {
  pair<long double, long double> O = GetO(A, B);
  A = A - O, B = B - O;
  long double x = atan2(A.second, A.first), y = atan2(B.second, B.first);
  if (y < x) y += 2 * 3.1415926535897932384626433832795;
  return ((y - x) * r * r - (A ^ B)) / 2;
}
long double Ans;
int main() {
  cin >> N >> r;
  if (N == 1) {
    cout << "0.0" << endl;
    return 0;
  }
  for (int i = 0; i < N; ++i) cin >> P[i].first >> P[i].second;
  sort(P, P + N);
  T = -1;
  for (int i = 0; i < N; ++i) {
    while (H < T && Cross(P[Convex[T - 1]], P[Convex[T]], P[i])) {
      In[Convex[T]] = 0;
      --T;
    }
    In[i] = 1;
    Convex[++T] = i;
  }
  In[0] = 0;
  H = T;
  for (int i = (N)-1; i > -1; --i) {
    if (!In[i]) {
      while (H < T && Cross(P[Convex[T - 1]], P[Convex[T]], P[i])) {
        In[Convex[T]] = 0;
        --T;
      }
      In[i] = 1;
      Convex[++T] = i;
    }
  }
  N = T;
  H = 0, T = -1;
  for (int i = 0; i < N; ++i) {
    while (H < T && InCircle(P[Circle[T - 1]], P[Circle[T]], P[Convex[i]])) {
      --T;
    }
    Circle[++T] = Convex[i];
  }
  bool Ch = 1;
  while (H + 1 != T && Ch) {
    Ch = 0;
    while (H + 1 != T && InCircle(P[Circle[T]], P[Circle[H]], P[Circle[H + 1]]))
      ++H, Ch = 1;
    while (H + 1 != T && InCircle(P[Circle[T - 1]], P[Circle[T]], P[Circle[H]]))
      --T, Ch = 1;
  }
  Circle[T + 1] = Circle[H];
  for (int i = (H); i <= (T); ++i) {
    Ans += (P[Circle[i]] ^ P[Circle[i + 1]]) / 2 +
           GetAns(P[Circle[i]], P[Circle[i + 1]]);
  }
  cout << fixed << setprecision(10) << Ans << endl;
  cin >> Ans;
  return 0;
}
