#include <bits/stdc++.h>
using namespace std;
int R;
struct point {
  long double first, second;
  point(long double first = 0, long double second = 0)
      : first(first), second(second) {}
  point operator-(point a) { return point(first - a.first, second - a.second); }
  point operator+(point a) { return point(first + a.first, second + a.second); }
  long double operator*(point a) { return first * a.first + second * a.second; }
  long double operator^(point a) { return first * a.second - second * a.first; }
  bool operator<(const point &a) const {
    if (fabs(a.first - first) > 1e-12) return first < a.first;
    return second < a.second - 1e-12;
  }
  long double nor() { return sqrt(*this * *this); }
  void input() { cin >> first >> second; }
  void print() { printf("%lf %lf\n", first, second); }
};
point p[101000], convex[101000];
long double val[101000];
long long tval[101000];
int pre[101000], nxt[101000];
const long double pi = acosl(-1);
int sgn(long double a) { return (a > 1e-12) - (a < -1e-12); }
long double calc_r(point a, point b, point c) {
  long double ab = (a - b).nor(), ac = (a - c).nor(), bc = (b - c).nor();
  return ab * ac / fabsl((a - b) ^ (b - c)) * bc / 2;
}
long double calc(point a, point b) {
  long double al = asinl((a - b).nor() / 2 / R) * 2;
  return 0.5 * (al - sinl(al)) * R * R;
}
int main() {
  int n;
  scanf("%d%d", &n, &R);
  for (int i = 0; i < n; i++) p[i].input();
  if (n == 1) {
    puts("0");
    return 0;
  }
  sort(p, p + n);
  int top = 0;
  for (int i = 0; i < n; i++) {
    while (top > 1 && sgn((convex[top - 2] - convex[top - 1]) ^
                          (p[i] - convex[top - 1])) <= 0)
      top--;
    convex[top++] = p[i];
  }
  for (int i = n - 2, t = top; i >= 0; i--) {
    while (top > t && sgn((convex[top - 2] - convex[top - 1]) ^
                          (p[i] - convex[top - 1])) <= 0)
      top--;
    convex[top++] = p[i];
  }
  n = top - 1;
  for (int i = 0; i < n; i++) p[i] = convex[i];
  set<pair<long long, int> > st;
  for (int i = 0; i < n; i++) {
    tval[i] =
        (long long)(calc_r(p[i], p[(i + 1) % n], p[(i + n - 1) % n]) * 1e12 +
                    1e-12);
    st.insert(pair<long long, int>(tval[i], i));
    pre[i] = (i + n - 1) % n;
    nxt[i] = (i + 1) % n;
  }
  while (n > 3) {
    pair<long long, int> a = *--st.end();
    if (a.first <= R * (long long)1e12) break;
    st.erase(--st.end());
    int pid = pre[a.second], nid = nxt[a.second];
    st.erase(st.find(pair<long long, int>(tval[pid], pid)));
    st.erase(st.find(pair<long long, int>(tval[nid], nid)));
    tval[pid] = (long long)(calc_r(p[pid], p[pre[pid]], p[nid]) * 1e12 + 1e-12);
    tval[nid] = (long long)(calc_r(p[nid], p[nxt[nid]], p[pid]) * 1e12 + 1e-12);
    st.insert(pair<long long, int>(tval[pid], pid));
    st.insert(pair<long long, int>(tval[nid], nid));
    nxt[pid] = nid;
    pre[nid] = pid;
    n--;
  }
  int a = (*st.begin()).second;
  for (int i = 0; i < n; i++) {
    convex[i] = p[a];
    a = nxt[a];
  }
  if (n == 3) {
    point a = convex[0], b = convex[1], c = convex[2];
    long double ab = (a - b) * (a - b), bc = (b - c) * (b - c),
                ac = (c - a) * (c - a);
    if (ab >= bc + ac) {
      convex[0] = a, convex[1] = b;
      n = 2;
    } else if (ac >= bc + ab) {
      convex[0] = a, convex[1] = c, n = 2;
    } else if (bc >= ab + ac) {
      convex[0] = b, convex[1] = c, n = 2;
    }
  }
  long double ans = 0;
  for (int i = 0; i < n; i++) ans += (convex[i] ^ convex[(i + 1) % n]);
  ans = fabsl(ans) / 2;
  for (int i = 0; i < n; i++) {
    ans += calc(convex[i], convex[(i + 1) % n]);
  }
  printf("%.10lf\n", (double)ans);
  return 0;
}
