/*   
* Aqui temos uma intersecção de assuntos muito famosa: geometria e binary search
* A ideia é definir a função f(R) como sendo verdadeira se todos os pontos no segmento considerado
* são cobertos por pelo menos um círculo de raio R centrado em um dos sensores.
* Queremos o first_true disso, e vamos trabalhar com ponto flutuante então fiquem ligados
*/
#include <bits/stdc++.h>
using namespace std;
using ld = long double;
const ld INF = 1e18;
struct Point{
    ld x,y;
    Point(): x(0), y(0) {}
    Point(ld x, ld y): x(x), y(y) {}
};
ld first_true(ld lo, ld hi, function<bool(ld)> f) {
	ld ans = hi;
	while (hi - lo > 0.0000001) {
		ld mid = (0.5)*(lo + hi);
		if (f(mid)) {
            ans = mid;
			hi = mid - 0.0000001;
		} else {
			lo = mid + 0.0000001;
		}
	}
	return ans;
}
int main(){
    int n; cin >> n;
    ld L; cin >> L;
    vector<Point> sensores;
    for(int i = 0; i < n; i++){
        ld x, y; cin >> x >> y;
        sensores.push_back(Point(x,y));
    }
    // Intersecção com a reta y = 0. Retorna os pontos ou alguma forma de 
    // dizer que não tem intersecção
    auto intersect = [&](Point C, ld R){
        bool works = R >= abs(C.y);
        pair<ld, ld> ret = {0,0};
        if(!works){
            return make_pair(works, ret);
        }
        ld dist = sqrt(R*R - (C.y)*(C.y));
        ret.first = C.x - dist; 
        ret.second = C.x + dist;
        
        
        return make_pair(works, ret);
    };
    /*
    * Exemplo: (-5, 1), (1, -1), (2, 1), (11, -1)
    * badIntervals: [-INF, -5], [1, 2]
    * False
    */ 
    auto f = [&](ld R){
        vector<pair<ld,int>> events;
        vector<pair<ld,ld>> badIntervals;
        for(int i = 0; i < n; i++){
            auto tmp = intersect (sensores[i], R);
            if(!tmp.first){
                continue;
            }
            events.push_back({tmp.second.first, 1});
            events.push_back({tmp.second.second, -1});
        }
        sort(events.begin(), events.end());
        // -INF, -2, 0, 1, 1, 10
        int cnt = 0;
        ld prev = -INF;
        for(auto [x, type] : events){
            if(cnt == 0){
                // Intervalo (prev, x) é paia
                if(0 <= prev && prev <= L){
                    return false;
                }
                if(0 <= x && x <= L){
                    return false;
                }
            }
            cnt += type;
            prev = x;
        }
        if(0 <= prev && prev <= L){
            return false;
        }
        return true;
    };
    cout << fixed << setprecision(6) << first_true (0, 1e9, f) << "\n";
    //cout << fixed << setprecision(4) << f(5.545455) << "\n";
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |