#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-8;
int sgn(double x) { return x < -eps ? -1 : x > eps; }
struct point {
  double x, y;
  point() : x(0), y(0) {}
  point(double a, double b) : x(a), y(b) {}
  point operator+(const point &b) const { return point(x + b.x, y + b.y); }
  point operator-(const point &b) const { return point(x - b.x, y - b.y); }
  point operator*(const double &b) const { return point(x * b, y * b); }
  point operator/(const double &b) const { return point(x / b, y / b); }
  bool operator==(const point &b) const {
    return (sgn(y - b.y) == 0 && sgn(x - b.x) == 0);
  }
  double operator*(const point &b) const { return x * b.x + y * b.y; }
  double X(const point &b) const { return x * b.y - y * b.x; }
  point rot(const double &ta) const {
    return point(cos(ta) * x - sin(ta) * y, sin(ta) * x + cos(ta) * y);
  }
  point rot90(const double &d) const { return point(-y, x) / len() * d; }
  double dis(const point &b) const {
    return sqrt(fabs((x - b.x) * (x - b.x) + (y - b.y) * (y - b.y)));
  }
  double len() const { return sqrt(x * x + y * y); }
};
struct polygon {
  point p[20];
  int n;
};
struct line {
  double a, b, c;
};
line linefromsegment(point p1, point p2) {
  line tmp;
  tmp.a = p2.y - p1.y;
  tmp.b = p1.x - p2.x;
  tmp.c = p2.x * p1.y - p1.x * p2.y;
  return tmp;
}
point lineinter(line l1, line l2) {
  point tmp;
  double a1 = l1.a, b1 = l1.b, c1 = l1.c, a2 = l2.a, b2 = l2.b, c2 = l2.c;
  if (sgn(b1) == 0) {
    tmp.x = -c1 / a1;
    tmp.y = (-c2 - a2 * tmp.x) / b2;
  } else {
    tmp.x = (c1 * b2 - b1 * c2) / (b1 * a2 - b2 * a1);
    tmp.y = (-c1 - a1 * tmp.x) / b1;
  }
  return tmp;
}
void cut_polygon(point p1, point p2, polygon &p) {
  p.p[p.n] = p.p[0];
  polygon new_polygon;
  line l1, l2;
  double t1, t2;
  new_polygon.n = 0;
  for (int i = 0; i < p.n; i++) {
    t1 = (p2 - p1).X(p.p[i] - p1);
    t2 = (p2 - p1).X(p.p[i + 1] - p1);
    if (sgn(t1) >= 0) new_polygon.p[new_polygon.n++] = p.p[i];
    if (sgn(t2) == 0) continue;
    if (t1 * t2 < 0) {
      l1 = linefromsegment(p1, p2);
      l2 = linefromsegment(p.p[i], p.p[i + 1]);
      new_polygon.p[new_polygon.n++] = lineinter(l1, l2);
    }
  }
  p = new_polygon;
  p.p[p.n] = p.p[0];
}
int n, h, f;
polygon a[550];
double cal(int th1, int th2) {
  polygon gao = a[th1];
  point cu[10];
  for (int i = 0; i < 4; i++) {
    cu[i] = a[th2].p[i];
    cu[i].y = -cu[i].y;
  }
  for (int i = 0; i < 4; i++) cut_polygon(cu[(i + 1) % 4], cu[i], gao);
  double s = 0;
  for (int i = 1; i < gao.n - 1; i++)
    s += (gao.p[i] - gao.p[0]).X(gao.p[i + 1] - gao.p[0]);
  return fabs(s / 2);
}
int main() {
  scanf("%d%d%d", &n, &h, &f);
  double ans = 0;
  for (int i = 1; i <= n; i++) {
    double x, y;
    scanf("%lf%lf", &x, &y);
    line l1 = linefromsegment(point(0, f), point(x, h));
    a[i].p[3] = point((h * l1.b - l1.c) / l1.a, -h);
    a[i].p[2] = point((-h * l1.b - l1.c) / l1.a, h);
    l1 = linefromsegment(point(0, f), point(y, h));
    a[i].p[1] = point((-h * l1.b - l1.c) / l1.a, h);
    a[i].p[0] = point((h * l1.b - l1.c) / l1.a, -h);
    a[i].n = 4;
    for (int j = 1; j < 3; j++)
      ans += fabs((a[i].p[j] - a[i].p[0]).X(a[i].p[j + 1] - a[i].p[0]));
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) ans -= cal(i, j);
  printf("%lf\n", ans);
}
