double calc(const Point &a, const Point &b, const Point &c) {
    double max_top = -1.0;
    for (int lower=0; lower<2; ++lower) {
        {
            const Circle C(a, b, R, lower);
            if (C.is_valid() && C.is_inside(c)) {
                max_top = max(max_top, C.top());
            }
        }
        {
            const Circle C(a, c, R, lower);
            if (C.is_valid() && C.is_inside(b)) {
                max_top = max(max_top, C.top());
            }
        }
        {
            const Circle C(c, b, R, lower);
            if (C.is_valid() && C.is_inside(a)) {
                max_top = max(max_top, C.top());
            }
        }
    }
    {
        const Circle C(a, Point(a.x, a.y+2*R), R, 0);
        if (C.is_valid() && C.is_inside(b) && C.is_inside(c)) {
            max_top = max(max_top, C.top());
        }
    }
    {
        const Circle C(b, Point(b.x, b.y+2*R), R, 0);
        if (C.is_valid() && C.is_inside(a) && C.is_inside(c)) {
            max_top = max(max_top, C.top());
        }
    }
    {
        const Circle C(c, Point(c.x, c.y+2*R), R, 0);
        if (C.is_valid() && C.is_inside(a) && C.is_inside(b)) {
            max_top = max(max_top, C.top());
        }
    }
    return max_top;
}
bool ok(const Point &a, const Point &b, const Point &c) {
    for (int lower=0; lower<2; ++lower) {
        {
            const Circle C(a, b, R, lower);
            if (C.is_valid() && C.bottom()<EPS && C.is_inside(c)) {
                return true;
            }
        }
        {
            const Circle C(a, c, R, lower);
            if (C.is_valid() && C.bottom()<EPS && C.is_inside(b)) {
                return true;
            }
        }
        {
            const Circle C(b, c, R, lower);
            if (C.is_valid() && C.bottom()<EPS && C.is_inside(a)) {
                return true;
            }
        }
        {
            const Circle C(a, Point(a.x, 0), R, lower);
            if (C.is_valid() && C.is_inside(b) && C.is_inside(c)) {
                return true;
            }
        }
        {
            const Circle C(b, Point(b.x, 0), R, lower);
            if (C.is_valid() && C.is_inside(a) && C.is_inside(c)) {
                return true;
            }
        }
        {
            const Circle C(c, Point(c.x, 0), R, lower);
            if (C.is_valid() && C.is_inside(a) && C.is_inside(b)) {
                return true;
            }
        }
    }
    
    return false;
}