← Home
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"sort"
	"strconv"
)

type Point struct {
	x, y float64
}

type Event struct {
	angle float64
	id    int
}

type EventList []Event

func (a EventList) Len() int           { return len(a) }
func (a EventList) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a EventList) Less(i, j int) bool { return a[i].angle < a[j].angle }

var events []Event
var stack []int
var inStack []int
var inStackIter int

func check(D float64, a float64, outposts []Point) bool {
	k := D * D / 4.0
	if k >= a*a {
		return true
	}

	events = events[:0]
	stack = stack[:0]
	inStackIter++

	CU := math.Sqrt(k)
	sqrt_a2_k := math.Sqrt(a*a - k)

	for i := 0; i < len(outposts); i++ {
		CV := -outposts[i].y * sqrt_a2_k
		C := outposts[i].x

		R := math.Sqrt(CU*CU + CV*CV)
		if R == 0 {
			continue
		}

		ratio := C / R
		if ratio > 1.0-1e-11 || ratio < -1.0+1e-11 {
			continue
		}

		phi := math.Atan2(CV, CU)
		delta := math.Acos(ratio)

		t1 := phi + delta
		t2 := phi - delta

		for t1 < 0 {
			t1 += 2 * math.Pi
		}
		for t1 >= 2*math.Pi {
			t1 -= 2 * math.Pi
		}
		for t2 < 0 {
			t2 += 2 * math.Pi
		}
		for t2 >= 2*math.Pi {
			t2 -= 2 * math.Pi
		}

		events = append(events, Event{t1, i}, Event{t2, i})
	}

	sort.Sort(EventList(events))

	for i := 1; i < len(events); i++ {
		if events[i].angle-events[i-1].angle < 1e-11 && events[i].id != events[i-1].id {
			return true
		}
	}
	if len(events) > 1 {
		if (2*math.Pi-events[len(events)-1].angle)+events[0].angle < 1e-11 && events[0].id != events[len(events)-1].id {
			return true
		}
	}

	for _, ev := range events {
		if inStack[ev.id] != inStackIter {
			inStack[ev.id] = inStackIter
			stack = append(stack, ev.id)
		} else {
			if len(stack) == 0 || stack[len(stack)-1] != ev.id {
				return true
			}
			stack = stack[:len(stack)-1]
		}
	}
	return false
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024)
	scanner.Split(bufio.ScanWords)

	scanFloat := func() float64 {
		scanner.Scan()
		f, _ := strconv.ParseFloat(scanner.Text(), 64)
		return f
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	a := scanFloat()

	outposts := make([]Point, n)
	for i := 0; i < n; i++ {
		outposts[i].x = scanFloat()
		outposts[i].y = scanFloat()
	}

	events = make([]Event, 0, 2*n)
	stack = make([]int, 0, n)
	inStack = make([]int, n)
	inStackIter = 0

	low := 0.0
	high := 2.0 * a

	for iter := 0; iter < 80; iter++ {
		mid := (low + high) / 2.0
		if check(mid, a, outposts) {
			high = mid
		} else {
			low = mid
		}
	}

	fmt.Printf("%.9f\n", high)
}