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.
/**
 * Problem: 
 * Source: ', Round
 * Link: 
 * 
 * @author Alexei Ostrovski
 */

import java.io.*;
import java.util.Arrays;
import java.util.Locale;
import java.util.Scanner;


public class CorridorSolver {

	public static final boolean DEBUG = false;
	public static double h, f, k;
	
	public static void main(String[] args) {
		//redirect input and output
		if (DEBUG)
		{
			try {
				System.setIn(new FileInputStream("input.txt"));
				//System.setOut(new PrintStream("input.txt"));
			} catch (IOException e) {
				//nothing
			}
			//generate();
			//return;
		}
		Scanner sc = new Scanner(System.in);

		//read data
		int n = sc.nextInt();
		h = sc.nextDouble();
		f = sc.nextDouble();
		
		double[] l = new double[n + 1], r = new double[n + 1];
		for (int i = 0; i < n; i++)
		{
			l[i] = sc.nextDouble();
			r[i] = sc.nextDouble();
		}
		
		//solve
		for (int i = 0; i < n; i++)
			if ((l[i] < 0) && (r[i] > 0))
			{
				//split the segement into two parts
				l[n] = 0;	r[n] = r[i];
				r[i] = 0;
				n++;
				break;
			}
		
		k = (f + h)/(f - h);
		//System.out.println(k);
		double result = 0.0;
		for (int i = 0; i < n; i++)
		{ //calculate area disregarding intersections
			result += 2 * (r[i] - l[i]) * h * (k + 1); 
		}
		//System.out.println(result);
		
		for (int i = 0; i < n; i++)
		{
			double left, right;
			if (r[i] > 0)
			{
				left = l[i]; right = r[i];
			} else {
				left = -r[i]; right = -l[i];
			}

			for (int j = i; j < n; j++)
			{ //calculate area of intersection between windows i and j
				double area1, area2, area3;
				double x1 = (r[i] > 0) ? l[j] : -r[j];
				double x2 = (r[i] > 0) ? r[j] : -l[j];
				
				double interL, interR;
				if (right / k <= k * left)
				{
					//calculate area1
					interL = x1; interR = x2;
					if (interL < left / k)	interL = left / k;
					if (interR > right / k)	interR = right / k;
					if (interL > interR)
						area1 = 0;
					else 
						area1 = triangle(interR, left) - triangle(interL, left);
					//System.out.println("S1: " + interR + " " + left);
					//calculate area2
					interL = x1; interR = x2;
					if (interL < right / k)	interL = right / k;
					if (interR > k * left)	interR = k * left;
					if (interL > interR)
						area2 = 0;
					else 
						area2 = triangle(interR, left) - triangle(interL, left) -
							triangle(interR, right) + triangle(interL, right);
					//calculate area3
					interL = x1; interR = x2;
					if (interL < k * left)	interL = k * left;
					if (interR > k * right)	interR = k * right;
					if (interL > interR)
						area3 = 0;
					else 
						area3 = triangle(right, interL) - triangle(right, interR);
				} else {
					//calculate area1
					interL = x1; interR = x2;
					if (interL < left / k)	interL = left / k;
					if (interR > k * left)	interR = k * left;
					if (interL > interR)
						area1 = 0;
					else 
						area1 = triangle(interR, left) - triangle(interL, left);
					//calculate area2
					interL = x1; interR = x2;
					if (interL < k * left)	interL = k * left;
					if (interR > right / k)	interR = right / k;
					if (interL > interR)
						area2 = 0;
					else 
						area2 = triangle(interR, left) - triangle(interL, left) -
							triangle(left, interR) + triangle(left, interL);
					//calculate area3
					interL = x1; interR = x2;
					if (interL < right / k)	interL = right / k;
					if (interR > k * right)	interR = k * right;
					if (interL > interR)
						area3 = 0;
					else 
						area3 = triangle(right, interL) - triangle(right, interR);
				}
				//System.out.println(String.format(Locale.ENGLISH, "(%d, %d): %.3f %.3f %.3f",
				//		i, j, area1, area2, area3));
				if (i == j)
					result -= (area1 + area2 + area3);
				else
					result -= 2 * (area1 + area2 + area3);
			}
		}
		
		//output
		System.out.println(String.format(Locale.ENGLISH, "%.8f", result));
	}
	
	public static double triangle(double a, double b)
	{
		if (a + b == 0)
			return 0.0; //so...yeah
		else
			return h * (k * a - b) * (k * a - b) / ((k - 1) * (a + b));
	}
	
	public static void generate()
	{
		int n = 500;
		System.out.println(n + " 1 2");
		for (int i = 0; i < n; i++)
			System.out.println(2*i + " " + (2*i + 1));
	}
}
