#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
int n, r;
class vec {
 public:
  double x, y;
  vec() {}
  vec(double tx, double ty) { x = tx, y = ty; };
  vec operator-(const vec &t) const { return vec(x - t.x, y - t.y); }
  double operator*(const vec &t) const { return x * t.y - y * t.x; }
  bool operator<(const vec &t) const { return x != t.x ? x < t.x : y < t.y; }
  double len() { return sqrt(x * x + y * y); }
} v[100010];
vector<vec> stk, convex;
class heap {
 public:
  priority_queue<pair<double, int> > A, B;
  void push(pair<double, int> x) { A.push(x); }
  void del(pair<double, int> x) { B.push(x); }
  pair<double, int> top() {
    while (!A.empty() && !B.empty() && A.top() == B.top()) A.pop(), B.pop();
    if (A.empty()) return make_pair(-1e9, -1);
    ;
    return A.top();
  }
} h;
int pre[100010], nxt[100010], st = 0;
void del(int p) {
  int s = pre[p], e = nxt[p];
  nxt[s] = e;
  pre[e] = s;
  if (p == st) st = e;
}
double getrad(vec a, vec b, vec c) {
  return abs((a - b).len() /
             (((a - c) * (b - c)) / ((a - c).len() * (b - c).len()))) /
         2;
}
int main() {
  scanf("%d%d", &n, &r);
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &v[i].x, &v[i].y);
  sort(v + 1, v + n + 1);
  for (int i = 1; i <= n; i++) {
    while (stk.size() >= 2 &&
           (stk.back() - stk[stk.size() - 2]) * (v[i] - stk.back()) >= 0)
      stk.pop_back();
    stk.push_back(v[i]);
  }
  convex = stk;
  stk.clear();
  for (int i = n; i >= 1; i--) {
    while (stk.size() >= 2 &&
           (stk.back() - stk[stk.size() - 2]) * (v[i] - stk.back()) >= 0)
      stk.pop_back();
    stk.push_back(v[i]);
  }
  for (int i = 1; i + 1 < stk.size(); i++) convex.push_back(stk[i]);
  int c = convex.size();
  double S = 0;
  for (int i = 0; i < c; i++) {
    nxt[i] = (i + 1) % c;
    pre[nxt[i]] = i;
    double r = getrad(convex[i], convex[(i + 1) % c], convex[(i + 2) % c]);
    h.push(make_pair(r, (i + 1) % c));
  }
  int cnt = c, p;
  while (h.top().first >= r && cnt > 2) {
    if (cnt == 3) {
      int v1 = st, v2 = nxt[st], v3 = pre[st];
      double D = max(
          max((convex[v1] - convex[v2]).len(), (convex[v2] - convex[v3]).len()),
          (convex[v3] - convex[v1]).len());
      S += ((long long)r * r * asin(D / (2 * r)) -
            D * sqrt((long long)r * r - D * D / 4) / 2) *
           2;
      goto output;
    }
    auto t = h.top();
    h.del(t);
    int s = pre[t.second], e = nxt[t.second];
    int ps = pre[s], pe = nxt[e];
    h.del(make_pair(getrad(convex[ps], convex[s], convex[t.second]), s));
    h.del(make_pair(getrad(convex[t.second], convex[e], convex[pe]), e));
    h.push(make_pair(getrad(convex[ps], convex[s], convex[e]), s));
    h.push(make_pair(getrad(convex[s], convex[e], convex[pe]), e));
    cnt--;
    del(t.second);
  }
  p = st;
  do {
    double D = (convex[p] - convex[nxt[p]]).len();
    S += (long long)r * r * asin(D / (2 * r)) -
         D * sqrt((long long)r * r - D * D / 4) / 2;
    S += convex[nxt[p]] * convex[p] / 2;
    p = nxt[p];
  } while (p != st);
output:
  printf("%.10lf\n", S);
  return 0;
}
