#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
int i, j, N, Num;
bool flag, flag1, flag2;
int f1, f2, f3, f4;
double H, F, Ans, X, Y, res;
double L[505], R[505], L1[505], R1[505];
double Al[505], Bl[505], Cl[505];
double Ar[505], Br[505], Cr[505];
struct node {
  double x, y, rad;
} Q[20];
int cmp(const node &i, const node &j) { return i.rad < j.rad; }
void Cross(double A1, double B1, double C1, double A2, double B2, double C2,
           double &x, double &y, bool &flag) {
  flag = 1;
  if (fabs(B1) < eps) {
    if (fabs(B2) < eps) {
      flag = 0, flag1 = flag2 = 1;
      return;
    }
    x = C1 / A1;
    y = (C2 - A2 * x) / B2;
    return;
  }
  if (fabs(B2) < eps) {
    x = C2 / A2;
    y = (C1 - A1 * x) / B1;
    return;
  }
  double p = B1 / B2;
  A2 *= p, B2 *= p, C2 *= p;
  if (fabs(A2 - A1) < eps && fabs(B2 - B1) < eps) {
    flag = 0, flag1 = flag2 = 1;
    return;
  }
  x = (C2 - C1) / (A2 - A1);
  y = (C2 - A2 * x) / B2;
}
void Insert(double x, double y, int &f1, int &f2) {
  if (y > H + eps) {
    flag1 = 1;
    return;
  }
  if (y < -H - eps) {
    flag2 = 1;
    return;
  }
  ++f1, ++f2;
  Q[++Num].x = x, Q[Num].y = y;
}
void Border(double l1, double r1, double l2, double r2, double y) {
  double l, r;
  if (l1 > l2)
    l = l1;
  else
    l = l2;
  if (r1 < r2)
    r = r1;
  else
    r = r2;
  if (l > r + eps) {
    if (Num == 2) {
      if (f1 && f2 && !(f3 & 1) && !(f4 & 1)) {
        if (f3) {
          Q[++Num].x = L[i], Q[Num].y = H;
          Q[++Num].x = R[i], Q[Num].y = H;
        } else {
          Q[++Num].x = L1[i], Q[Num].y = -H;
          Q[++Num].x = R1[i], Q[Num].y = -H;
        }
      }
      if (f3 && f4 && !(f1 & 1) && !(f2 & 1)) {
        if (f1) {
          Q[++Num].x = L1[j], Q[Num].y = -H;
          Q[++Num].x = R1[j], Q[Num].y = -H;
        } else {
          Q[++Num].x = L[j], Q[Num].y = H;
          Q[++Num].x = R[j], Q[Num].y = H;
        }
      }
    }
    return;
  }
  Q[++Num].x = l, Q[Num].y = y;
  Q[++Num].x = r, Q[Num].y = y;
}
double Det(double X1, double Y1, double X2, double Y2) {
  return X1 * Y2 - X2 * Y1;
}
double Area() {
  int i;
  double Sum = 0, Ox = 0, Oy = 0;
  for (i = 1; i <= Num; ++i) Ox += Q[i].x, Oy += Q[i].y;
  Ox /= Num, Oy /= Num;
  for (i = 1; i <= Num; ++i)
    Q[i].x -= Ox, Q[i].y -= Oy, Q[i].rad = atan2(Q[i].y, Q[i].x);
  sort(Q + 1, Q + Num + 1, cmp);
  for (i = 1; i <= Num; ++i)
    Sum += Det(Q[i].x, Q[i].y, Q[i % Num + 1].x, Q[i % Num + 1].y);
  return fabs(Sum / 2);
}
int main() {
  scanf("%d%lf%lf", &N, &H, &F);
  for (i = 1; i <= N; ++i) {
    scanf("%lf%lf", &L[i], &R[i]);
    Al[i] = F - H, Bl[i] = L[i], Cl[i] = L[i] * F;
    Ar[i] = F - H, Br[i] = R[i], Cr[i] = R[i] * F;
    Cross(Al[i], Bl[i], Cl[i], 0, 1, -H, L1[i], Y, flag);
    Cross(Ar[i], Br[i], Cr[i], 0, 1, -H, R1[i], Y, flag);
    Ans += 2 * (R[i] - L[i] + R1[i] - L1[i]) * H;
    for (j = 1; j <= i; ++j) {
      Num = 0;
      flag1 = flag2 = 0;
      f1 = f2 = f3 = f4 = 0;
      Cross(Al[i], Bl[i], Cl[i], Al[j], -Bl[j], Cl[j], X, Y, flag);
      if (flag) Insert(X, Y, f1, f3);
      Cross(Al[i], Bl[i], Cl[i], Ar[j], -Br[j], Cr[j], X, Y, flag);
      if (flag) Insert(X, Y, f1, f4);
      Cross(Ar[i], Br[i], Cr[i], Al[j], -Bl[j], Cl[j], X, Y, flag);
      if (flag) Insert(X, Y, f2, f3);
      Cross(Ar[i], Br[i], Cr[i], Ar[j], -Br[j], Cr[j], X, Y, flag);
      if (flag) Insert(X, Y, f2, f4);
      if (Num == 0) continue;
      if (flag1) Border(L[i], R[i], L1[j], R1[j], H);
      if (flag2) Border(L1[i], R1[i], L[j], R[j], -H);
      res = Area();
      Ans -= res;
      if (i != j) Ans -= res;
    }
  }
  printf("%.10lf\n", Ans);
  return 0;
}
