#include <bits/stdc++.h>
using namespace std;
struct line {
  int l, r;
} p[510], q[510];
struct Point {
  long double x, y;
} Q[10], tmp[10];
int vis[10];
long double A, B, C;
int n, H, F, tot, cnt;
void read(int &x) {
  char ch = getchar();
  int mark = 1;
  for (; ch != '-' && (ch < '0' || ch > '9'); ch = getchar())
    ;
  if (ch == '-') mark = -1, ch = getchar();
  for (x = 0; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48;
  x *= mark;
}
inline bool cmp(line a, line b) {
  if (a.l == b.l) return a.r > b.r;
  return a.l < b.l;
}
inline long double Get(long double x, long double y) {
  return A * x + B * y + C;
}
inline long double Abs(long double x) {
  if (x < 0) return -x;
  return x;
}
inline long double dis(Point X, long double A, long double B, long double C) {
  return Abs(X.x * A + X.y * B + C) / sqrt(A * A + B * B);
}
inline long double Getsum(long double x1, long double y1, long double x2,
                          long double y2) {
  return x1 * y2 - x2 * y1;
}
Point Getp(Point X, Point Y, long double A, long double B, long double C) {
  long double d1 = dis(X, A, B, C), d2 = dis(Y, A, B, C);
  Point Ans;
  Ans.x = (d2 * X.x + d1 * Y.x) / (d1 + d2);
  Ans.y = (d2 * X.y + d1 * Y.y) / (d1 + d2);
  return Ans;
}
void solve() {
  int tot = 0;
  int s1 = 0, s2 = 0;
  for (int k = 1; k <= cnt; k++) {
    double t = Get(Q[k].x, Q[k].y);
    if (t == 0)
      vis[k] = -1, s2++;
    else if (t > 0)
      vis[k] = 1, s1++;
    else
      vis[k] = -1, s2++;
  }
  if (s1 == 0) {
    cnt = 0;
    return;
  } else if (s2 == 0)
    return;
  Q[cnt + 1] = Q[1];
  vis[cnt + 1] = vis[1];
  for (int i = 1; i <= cnt; i++) {
    if (vis[i] == 1) tmp[++tot] = Q[i];
    if (vis[i] * vis[i + 1] < 0) {
      tmp[++tot] = Getp(Q[i], Q[i + 1], A, B, C);
    }
  }
  cnt = tot;
  for (int i = 1; i <= cnt; i++) Q[i] = tmp[i];
}
int main() {
  read(n);
  read(H);
  read(F);
  for (int i = 1; i <= n; i++) read(p[i].l), read(p[i].r);
  sort(p + 1, p + n + 1, cmp);
  q[++tot] = p[1];
  for (int i = 2; i <= n; i++) {
    if (p[i].l > q[tot].r)
      q[++tot] = p[i];
    else
      q[tot].r = max(q[tot].r, p[i].r);
  }
  long double sum = 0;
  for (int i = 1; i <= tot; i++) {
    long double d = (long double)(F + H) / (F - H) * (q[i].r - q[i].l);
    sum += (d + q[i].r - q[i].l) * H * 2;
  }
  for (int i = 1; i <= tot; i++) {
    for (int j = 1; j <= tot; j++) {
      cnt = 4;
      Q[1].x = q[i].l;
      Q[1].y = -H;
      Q[2].x = q[i].r;
      Q[2].y = -H;
      Q[3].x = (long double)(F + H) / (F - H) * q[i].r;
      Q[3].y = H;
      Q[4].x = (long double)(F + H) / (F - H) * q[i].l;
      Q[4].y = H;
      A = H - F;
      B = -q[j].l;
      C = F * q[j].l;
      A = -A;
      B = -B;
      C = -C;
      solve();
      if (cnt <= 2) continue;
      A = H - F;
      B = -q[j].r;
      C = F * q[j].r;
      solve();
      if (cnt <= 2) continue;
      long double over = 0;
      for (int k = 2; k < cnt; k++)
        over += Getsum(Q[k].x - Q[1].x, Q[k].y - Q[1].y, Q[k + 1].x - Q[1].x,
                       Q[k + 1].y - Q[1].y) /
                2;
      sum -= over;
    }
  }
  printf("%.7lf\n", (double)sum);
  return 0;
}
