#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
struct point {
  double first, second;
  point(double first = 0, double second = 0) : first(first), second(second) {}
  inline double operator^(point a) {
    return first * a.second - second * a.first;
  }
  inline double operator*(point a) {
    return first * a.first + second * a.second;
  }
  inline point operator*(double a) { return point(first * a, second * a); }
  inline point operator/(double a) { return point(first / a, second / a); }
  inline point operator-(point a) {
    return point(first - a.first, second - a.second);
  }
  inline point operator+(point a) {
    return point(first + a.first, second + a.second);
  }
  inline point rotate(double al) { return *this & point(cos(al), sin(al)); }
  inline point operator&(point a) {
    return point(first * a.first - second * a.second,
                 first * a.second + second * a.first);
  }
  inline point norm() {
    double s = nor();
    if (s < 1e-7) return *this;
    return point(first / s, second / s);
  }
  inline int pos() {
    return second > 1e-7 || fabs(second) < 1e-7 && first > -1e-7;
  }
  inline double nor() { return sqrt(nor2()); }
  inline double nor2() { return *this * *this; }
  inline point conj() { return point(-second, first); }
  inline double al() { return atan2(second, first); }
  inline bool operator<(const point &a) const {
    if (fabs(first - a.first) > 1e-7) return first < a.first;
    return second < a.second - 1e-7;
  }
  inline void input() { scanf("%lf %lf", &first, &second); }
  inline void print() { printf("%lf %lf\n", first, second); }
};
inline int sgn(double a) { return (a > 1e-7) - (a < -1e-7); }
inline bool is_on(point a, point b, point c) {
  if (sgn(a - b ^ b - c)) return 0;
  return sgn((a - c) * (b - c)) <= 0;
}
inline double angle(point a, point b) {
  double res = a * b / a.nor() / b.nor();
  res = acos(res);
  return res;
}
inline double angle(point a, point b, point c) { return angle(a - b, c - b); }
int n;
double r, ans;
point p[100000];
inline bool in(point a, point b, point c) {
  point M = (b + c) / 2;
  point dir = (c - b).conj().norm();
  point O = M + dir * sqrt(r * r - (b - M).nor2());
  return (O - a).nor() < r + 1e-7;
}
inline double fan_size(point a, point b) {
  point M = (a + b) / 2,
        dir = (b - a).conj().norm() * sqrt(r * r - (b - M).nor2());
  point O = M + dir;
  double ang = angle(a, O, b);
  return (r * r * ang - (a - b).nor() * (M - O).nor()) / 2;
}
int main() {
  scanf("%d %lf", &n, &r);
  if (n == 1) return puts("0");
  for (int i = 0; i < n; i++) {
    p[i].input();
    if (p[i] < p[0]) swap(p[0], p[i]);
  }
  sort(p + 1, p + n, [](point a, point b) {
    a = a - p[0], b = b - p[0];
    int sg = sgn(a ^ b);
    if (sg) return sg > 0;
    return a.nor() < b.nor();
  });
  int N = 0;
  for (int i = 0; i < n; i++) {
    while (N > 1 && (p[N - 1] - p[i] ^ p[N - 2] - p[i]) > -1e-7) N--;
    p[N++] = p[i];
  }
  n = 0;
  for (int i = 0; i < N; i++) {
    while (n > 1 && in(p[n - 1], p[n - 2], p[i])) n--;
    p[n++] = p[i];
  }
  p[n] = p[0];
  int st = 0, ed = n - 1;
  while (st + 1 < ed) {
    if (in(p[ed], p[ed - 1], p[st]))
      ed--;
    else if (in(p[st], p[ed], p[st + 1]))
      st++;
    else
      break;
  }
  p[ed + 1] = p[st];
  for (int i = st; i <= ed; i++) ans += p[i] ^ p[i + 1];
  ans /= 2;
  for (int i = st; i <= ed; i++) ans += fan_size(p[i], p[i + 1]);
  printf("%.5lf", ans);
}
