#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-12;
const int maxn = 1e5;
struct vec {
  double x, y;
  vec(void) {}
  vec(double x, double y) : x(x), y(y) {}
  vec operator+(const vec &b) const { return vec(x + b.x, y + b.y); }
  vec operator-(const vec &b) const { return vec(x - b.x, y - b.y); }
  vec operator*(double b) const { return vec(x * b, y * b); }
  double det(const vec &b) const { return x * b.y - y * b.x; }
  double dot(const vec &b) const { return x * b.x + y * b.y; }
  double len(void) const { return sqrt(norm()); }
  double norm(void) const { return x * x + y * y; }
  bool operator<(const vec &b) const {
    return fabs(x - b.x) < eps ? y < b.y : x < b.x;
  }
  bool operator==(const vec &b) const {
    return fabs(x - b.x) < eps && fabs(y - b.y) < eps;
  }
};
int n;
vec a[maxn];
int m;
int b[maxn];
double rad;
double Cross(vec a, vec b, vec c) { return (b - a).det(c - a); }
double Acos(double t) {
  if (t > 1 - eps) return acos(1);
  if (t < -1 + eps) return acos(-1);
  return acos(t);
}
double GetA(double len) {
  return Acos((2 * rad * rad - len * len) / (2 * rad * rad));
}
void Convex(void) {
  sort(a, a + n);
  m = 0;
  for (int i = 0; i < n; ++i) {
    while (m > 1 && Cross(a[b[m - 2]], a[b[m - 1]], a[i]) <= eps) {
      --m;
    }
    b[m++] = i;
  }
  for (int i = n - 2, k = m; i >= 0; --i) {
    while (m > k && Cross(a[b[m - 2]], a[b[m - 1]], a[i]) <= eps) {
      --m;
    }
    b[m++] = i;
  }
  --m;
  if (m == 2 && a[b[0]] == a[b[1]]) {
    --m;
  }
}
struct Node {
  int id, prev, next;
} nd[maxn];
bool inque[maxn];
int head;
int main(void) {
  scanf("%d%lf", &n, &rad);
  for (int i = 0; i < n; ++i) {
    scanf("%lf%lf", &a[i].x, &a[i].y);
  }
  Convex();
  if (m == 1) {
    puts("0");
    return 0;
  }
  queue<int> q;
  for (int i = 0; i < m; ++i) {
    nd[i] = (Node){b[i], (i + m - 1) % m, (i + 1) % m};
    q.push(i);
    inque[i] = true;
  }
  head = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inque[u] = false;
    int v1 = nd[u].prev, v2 = nd[u].next;
    if (GetA((a[nd[u].id] - a[nd[v1].id]).len()) +
            GetA((a[nd[u].id] - a[nd[v2].id]).len()) <=
        GetA((a[nd[v1].id] - a[nd[v2].id]).len())) {
      nd[v1].next = v2;
      nd[v2].prev = v1;
      if (!inque[v1]) {
        inque[v1] = true;
        q.push(v1);
      }
      if (!inque[v2]) {
        inque[v2] = true;
        q.push(v2);
      }
      head = v1;
      if (--m == 1) {
        puts("BAD");
        throw;
      }
    }
  }
  double ans = 0;
  for (int u = head;;) {
    int v = nd[u].next;
    int i = nd[u].id, j = nd[v].id;
    ans += a[i].det(a[j]);
    double t = GetA((a[i] - a[j]).len());
    ans += rad * rad * (t - sin(t));
    if ((u = v) == head) break;
  }
  printf("%.10lf\n", ans * 0.5);
  return 0;
}
