#include <bits/stdc++.h>
using namespace std;
enum { MAXN = 505 };
int l[MAXN], r[MAXN];
struct pt {
  double x, y;
  pt(double _x = 0, double _y = 0) : x(_x), y(_y) {}
};
pt operator-(const pt &a, const pt &b) { return pt(a.x - b.x, a.y - b.y); }
double det(const pt &a, const pt &b) { return a.x * b.y - a.y * b.x; }
double Gans(const vector<pt> &lst) {
  double ans = 0;
  for (int i = 1; i + 1 < lst.size(); i++)
    ans += det(lst[i] - lst[0], lst[i + 1] - lst[0]);
  ans /= 2;
  return fabs(ans);
}
int main() {
  int n, h, f;
  scanf("%d%d%d", &n, &h, &f);
  for (int i = 0; i < n; i++) scanf("%d%d", &l[i], &r[i]);
  double ans = 0, mul = (double)(h + f) / (f - h);
  for (int i = 0; i < n; i++) ans += (mul + 1) * (r[i] - l[i]) * h * 2;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      vector<pt> graph;
      double a, b;
      a = max((double)l[i], l[j] * mul);
      b = min((double)r[i], r[j] * mul);
      if (a <= b) {
        graph.push_back(pt(b, h));
        graph.push_back(pt(a, h));
      }
      a = -h;
      b = h;
      if (l[i] + l[j] > 0)
        b = min(b, (double)(l[i] - l[j]) * f / (l[i] + l[j]));
      else if (l[i] + l[j] == 0) {
        if (l[i] - l[j] < 0) a = h, b = -h;
      } else
        a = max(a, (double)(l[i] - l[j]) * f / (l[i] + l[j]));
      if (l[i] + r[j] > 0)
        a = max(a, (double)(l[i] - r[j]) * f / (l[i] + r[j]));
      else if (l[i] + r[j] == 0) {
        if (l[i] - r[j] > 0) a = h, b = -h;
      } else
        b = min(b, (double)(l[i] - r[j]) * f / (l[i] + r[j]));
      if (a <= b) {
        graph.push_back(pt((double)l[i] * (b - f) / -(f - h), b));
        graph.push_back(pt((double)l[i] * (a - f) / -(f - h), a));
      }
      a = max(l[i] * mul, (double)l[j]);
      b = min(r[i] * mul, (double)r[j]);
      if (a <= b) {
        graph.push_back(pt(a, -h));
        graph.push_back(pt(b, -h));
      }
      a = -h;
      b = h;
      if (r[i] + l[j] > 0)
        b = min(b, (double)(r[i] - l[j]) * f / (r[i] + l[j]));
      else if (r[i] + l[j] == 0) {
        if (r[i] - l[j] < 0) a = h, b = -h;
      } else
        a = max(a, (double)(r[i] - l[j]) * f / (r[i] + l[j]));
      if (r[i] + r[j] > 0)
        a = max(a, (double)(r[i] - r[j]) * f / (r[i] + r[j]));
      else if (r[i] + r[j] == 0) {
        if (r[i] - r[j] > 0) a = h, b = -h;
      } else
        b = min(b, (double)(r[i] - r[j]) * f / (r[i] + r[j]));
      if (a <= b) {
        graph.push_back(pt((double)r[i] * (a - f) / -(f - h), a));
        graph.push_back(pt((double)r[i] * (b - f) / -(f - h), b));
      }
      ans -= Gans(graph);
    }
  printf("%.10f\n", ans);
  return 0;
}
