#include <bits/stdc++.h>
using namespace std;
long long int n, m, heap[100100], idx[100100], hsz, lft[100100], rght[100100];
double rad[100100], r;
pair<double, double> p[100100], hull[100100];
double angle2(pair<double, double> a, pair<double, double> b) {
  double dx = b.first - a.first, dy = b.second - a.second;
  if (b.first == a.first) {
    if (dy > 0) return acos(-1) / 2;
    return 3 * acos(-1) / 2;
  }
  if (dx >= 0 && dy >= 0) return atan(dy / dx);
  if (dx < 0 && dy >= 0) return acos(-1) - atan(fabs(dy / dx));
  if (dx < 0 && dy < 0) return acos(-1) + atan(dy / dx);
  return 2 * acos(-1) - atan(fabs(dy / dx));
}
double angle(pair<double, double> a, pair<double, double> b,
             pair<double, double> c) {
  double t1 = angle2(b, a), t2 = angle2(b, c);
  return min(fabs(t1 - t2), 2 * acos(-1) - fabs(t1 - t2));
}
double area(pair<double, double> a, pair<double, double> b,
            pair<double, double> c) {
  return (a.first - b.first) * (b.second - c.second) -
         (a.second - b.second) * (b.first - c.first);
}
double dis(pair<double, double> a, pair<double, double> b) {
  return sqrt((a.first - b.first) * (a.first - b.first) +
              (a.second - b.second) * (a.second - b.second));
}
double arc(pair<double, double> a, pair<double, double> b) {
  double d = dis(a, b) / 2;
  return r * r * asin(d / r) - d * sqrt(r * r - d * d) +
         (a.first * b.second - b.first * a.second) / 2;
}
bool cmp(pair<double, double> x, pair<double, double> y) {
  if (area(x, y, p[1]) > 1e-10) return 1;
  if (area(x, y, p[1]) < -1e-10) return 0;
  return dis(p[1], x) < dis(p[1], y);
}
void change(long long int u, long long int v) {
  swap(idx[heap[u]], idx[heap[v]]);
  swap(heap[u], heap[v]);
}
void up(long long int ind) {
  while (ind > 1 && rad[heap[ind]] > rad[heap[ind / 2]]) {
    change(ind, ind / 2);
    ind /= 2;
  }
}
void down(long long int ind) {
  long long int mxp = ind;
  if (2 * ind <= hsz && rad[heap[2 * ind]] > rad[heap[mxp]]) mxp = 2 * ind;
  if (2 * ind + 1 <= hsz && rad[heap[2 * ind + 1]] > rad[heap[mxp]])
    mxp = 2 * ind + 1;
  if (mxp != ind) {
    change(ind, mxp);
    down(mxp);
  }
}
void calc(long long int x) {
  pair<double, double> a = hull[lft[x]], b = hull[x], c = hull[rght[x]];
  rad[x] = (angle(a, b, c) > (acos(-1) / 2 - 1e-10)) * dis(a, b) * dis(b, c) *
           dis(c, a) / (2 * fabs(area(a, b, c)));
  up(idx[x]);
}
int main() {
  cin >> n >> r;
  for (int i = 1; i <= n; i++) {
    cin >> p[i].first >> p[i].second;
    if (p[i].second < p[1].second ||
        (p[i].second < p[1].second + 1e-10 && p[i].first < p[1].first))
      swap(p[1], p[i]);
  }
  sort(p + 2, p + n + 1, cmp);
  hull[m = 1] = p[1];
  for (int i = 2; i <= n; i++) {
    while (m > 1 && area(p[i], hull[m], hull[m - 1]) > -1e-10) m--;
    hull[++m] = p[i];
  }
  hsz = m;
  for (int i = 1; i <= m; i++) {
    heap[i] = i;
    idx[i] = i;
    lft[i] = i - 1;
    rght[i] = i + 1;
  }
  lft[1] = m;
  rght[m] = 1;
  for (int i = 1; i <= m; i++) calc(i);
  while (rad[heap[1]] > r) {
    long long int u = heap[1];
    change(1, hsz--);
    down(1);
    rght[lft[u]] = rght[u];
    lft[rght[u]] = lft[u];
    calc(lft[u]);
    calc(rght[u]);
  }
  double res = arc(hull[heap[1]], hull[rght[heap[1]]]);
  for (int i = rght[heap[1]]; i != heap[1]; i = rght[i]) {
    res += arc(hull[i], hull[rght[i]]);
  }
  printf("%.10lf\n", res);
  return 0;
}
