Consider a house plan. 

Let the house be represented by an infinite horizontal strip defined by the inequality  - h ≤ y ≤ h. Strictly outside the house there are two light sources at the points (0, f) and (0, - f). Windows are located in the walls, the windows are represented by segments on the lines y = h and y = - h. Also, the windows are arranged symmetrically about the line y = 0.

Your task is to find the area of the floor at the home, which will be lighted by the sources of light. 

<image>

Input

The first line of the input file contains three integers n, h and f (1 ≤ n ≤ 500, 1 ≤ h ≤ 10, h < f ≤ 1000). Next, n lines contain two integers each li, ri ( - 5000 ≤ li < ri ≤ 5000), each entry indicates two segments. Endpoints of the first segment are (li, h)-(ri, h), and endpoints of the second segment are (li, - h)-(ri, - h). These segments describe location of windows. Numbers in the lines are space-separated. It is guaranteed that no two distinct segments have common points. 

Output

Print the single real number — the area of the illuminated part of the floor with an absolute or relative error of no more than 10 - 4.

Examples

Input

1 1 2
-1 1


Output

10.0000000000


Input

2 2 4
-1 0
1 2


Output

23.3333333333

Note

The second sample test is shown on the figure. Green area is the desired area of the illuminated part of the floor. Violet segments indicate windows.
#include <bits/stdc++.h>
using namespace std;
const int NUM = 500 + 10;
struct point {
  double first, second;
  point(double a, double b) {
    first = a;
    second = b;
  }
  point() {}
  void print() const { cout << "(" << first << "," << second << ")"; }
};
double chaji(const point& s, const point& a, const point& b) {
  return (a.first - s.first) * (b.second - s.second) -
         (a.second - s.second) * (b.first - s.first);
}
point operator+(const point& a, const point& b) {
  return point(a.first + b.first, a.second + b.second);
}
point operator-(const point& a, const point& b) {
  return point(a.first - b.first, a.second - b.second);
}
point operator*(const point& a, const double& c) {
  return point(a.first * c, a.second * c);
}
point operator/(const point& a, const double& c) {
  return point(a.first / c, a.second / c);
}
int sign(double a) {
  if (abs(a) < 1e-9) return 0;
  return a > 0 ? 1 : -1;
}
int cross(const point& a, const point& b, const point& c, const point& d) {
  return sign(chaji(a, c, b)) * sign(chaji(a, b, d)) >= 0;
}
point inter(const point& a, const point& b, const point& c, const point& d) {
  double s = chaji(a, c, d);
  double s2 = chaji(a, c, b) + chaji(a, b, d);
  return a + (b - a) * (s / s2);
}
double sqr(double first) { return first * first; }
double dist(const point& a, const point& b) {
  return sqr(a.first - b.first) + sqr(a.second - b.second);
}
struct Vec {
  point first, second;
  double ang;
  Vec(point s, point t) {
    first = s;
    second = t;
  }
  Vec() {}
  void print() {
    first.print();
    cout << " ";
    second.print();
    cout << endl;
  }
};
point inter(const Vec& a, const Vec& b) {
  return inter(a.first, a.second, b.first, b.second);
}
int operator<(const Vec& a, const Vec& b) {
  if (a.ang != b.ang) return a.ang > b.ang;
  return chaji(b.first, b.second, a.first) > 0;
}
vector<point> convex[NUM];
Vec st[NUM];
int first, last;
vector<point> get(vector<Vec> now) {
  int i;
  vector<point> ans;
  for ((i) = (0); (i) != (now.size()); ++(i)) {
    Vec line = now[i];
    now[i].ang = atan2(line.second.second - line.first.second,
                       line.second.first - line.first.first);
  }
  sort(now.begin(), now.end());
  first = last = 1;
  for ((i) = (0); (i) != (now.size()); ++(i)) {
    if (i != 0 && abs(now[i].ang - now[i - 1].ang) < 1e-16) continue;
    while (first + 1 < last &&
           chaji(now[i].first, inter(st[last - 1], st[last - 2]),
                 now[i].second) > 0)
      --last;
    while (first + 1 < last &&
           chaji(now[i].first, inter(st[first], st[first + 1]), now[i].second) >
               0)
      ++first;
    st[last++] = now[i];
  }
  while (first + 2 < last &&
         chaji(st[first].first, inter(st[last - 1], st[last - 2]),
               st[first].second) > 0)
    --last;
  while (first + 2 < last &&
         chaji(st[last - 1].first, inter(st[first], st[first + 1]),
               st[last - 1].second) > 0)
    ++first;
  if (first + 2 > last) return ans;
  for ((i) = (first); (i) != (last); ++(i)) {
    int j = (i + 1 != last ? i + 1 : first);
    ans.push_back(inter(st[i], st[j]));
  }
  return ans;
}
int n;
double h, f;
double l[NUM], r[NUM];
double check(int a, int b) {
  vector<Vec> d;
  int One = 100;
  d.push_back(Vec(point(2e9, 2e9), point(-2e9, 2e9)));
  d.push_back(Vec(point(-2e9, 2e9), point(-2e9, -2e9)));
  d.push_back(Vec(point(-2e9, -2e9), point(2e9, -2e9)));
  d.push_back(Vec(point(2e9, -2e9), point(2e9, 2e9)));
  d.push_back(Vec(point(One, h), point(-One, h)));
  d.push_back(Vec(point(-One, -h), point(One, -h)));
  d.push_back(Vec(point(0, f), point(l[a], h)));
  d.push_back(Vec(point(r[a], h), point(0, f)));
  d.push_back(Vec(point(0, -f), point(r[b], -h)));
  d.push_back(Vec(point(l[b], -h), point(0, -f)));
  vector<point> c = get(d);
  int i;
  if (c.size() < 3) return 0;
  double ans = 0;
  for ((i) = (0); (i) != (c.size()); ++(i)) {
    int j = (i + 1) % c.size();
    ans += chaji(point(0, 0), c[i], c[j]);
  }
  return abs(ans) / 2;
}
int main() {
  int i, j;
  scanf("%d%lf%lf", &n, &h, &f);
  for ((i) = (1); (i) <= (n); ++(i)) scanf("%lf%lf", &l[i], &r[i]);
  double tot = 0;
  for ((i) = (1); (i) <= (n); ++(i)) {
    double area = (r[i] - l[i]) * (f - h) / 2;
    tot += (sqr((f + h) / (f - h)) - 1) * area * 2;
    for ((j) = (i); (j) <= (n); ++(j)) {
      tot -= check(i, j);
      if (i != j) tot -= check(i, j);
    }
  }
  printf("%.4lf\n", tot);
  return 0;
}
