#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9, pi = acos(-1.0);
int dcmp(double d) { return fabs(d) <= eps ? 0 : d < 0 ? -1 : 1; }
struct point {
  double x, y;
  point() {}
  point(double x, double y) : x(x), y(y) {}
  point operator+(const point& p) const { return point(x + p.x, y + p.y); }
  point operator-(const point& p) const { return point(x - p.x, y - p.y); }
  double operator*(const point& p) const { return x * p.y - y * p.x; }
  bool operator<(const point& p) const {
    return dcmp(x - p.x) ? x < p.x : y < p.y;
  }
  void scan() { scanf("%lf%lf", &x, &y); }
} a[101000], sta[101000];
double cross(point a, point b, point c) { return (c - a) * (b - a); }
double dist(point a, point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int pd(point a, point b, point c) {
  double da = dist(a, b), db = dist(b, c), dc = dist(c, a);
  return dcmp(da * da + db * db - dc * dc) >= 0;
}
double getr(point a, point b, point c) {
  return pd(a, b, c)
             ? 0
             : dist(a, b) * dist(b, c) * dist(c, a) / 2 / fabs(cross(a, b, c));
}
double getS(point a, point b, double R) {
  double dis = dist(a, b);
  double ang = 2 * asin(dis / 2 / R);
  return ang / 2 * R * R - R * R * sin(ang) / 2;
}
double d[101000];
priority_queue<pair<double, int> > Q;
int pre[101000], vis[101000], nxt[101000], n, tp, R;
int main() {
  scanf("%d%d", &n, &R);
  for (int i = 1; i <= n; ++i) a[i].scan();
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= n; ++i) {
    while (tp > 1 && dcmp(cross(sta[tp - 1], sta[tp], a[i])) <= 0) tp--;
    sta[++tp] = a[i];
  }
  int m = tp;
  for (int i = n - 1; i >= 1; --i) {
    while (tp > m && dcmp(cross(sta[tp - 1], sta[tp], a[i])) <= 0) tp--;
    sta[++tp] = a[i];
  }
  if (n > 1) tp--;
  auto cal = [&](int i) {
    d[i] = getr(sta[pre[i]], sta[i], sta[nxt[i]]);
    Q.push(pair<double, int>(d[i], i));
  };
  for (int i = 1; i <= tp; ++i) {
    pre[i] = i == 1 ? tp : i - 1;
    nxt[i] = i == tp ? 1 : i + 1;
    cal(i);
  }
  int C = tp;
  while (Q.size() && Q.top().first > R && C > 2) {
    pair<double, int> p = Q.top();
    Q.pop();
    if (vis[p.second] || p.first != d[p.second]) continue;
    pre[nxt[p.second]] = pre[p.second];
    nxt[pre[p.second]] = nxt[p.second];
    cal(pre[p.second]);
    cal(nxt[p.second]);
    vis[p.second] = 1;
    C--;
  }
  double ans = 0;
  for (int i = 1; i <= tp; ++i)
    if (!vis[i]) {
      point p = sta[i], q = sta[nxt[i]];
      ans += fabs(p * q) / 2 + getS(p, q, R);
    }
  printf("%.10lf", ans);
}
