#include #include #include #include using namespace std; const double EPS = 1e-10; #define MAX 1000 int cmp(double x, double y = 0, double tol = EPS) { return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1; } struct point { double x, y; point(double x = 0, double y = 0): x(x), y(y) {} point operator +(point q) { return point(x + q.x, y + q.y); } point operator -(point q) { return point(x - q.x, y - q.y); } point operator *(double t) { return point(x * t, y * t); } point operator /(double t) { return point(x / t, y / t); } double operator *(point q) { return x * q.x + y * q.y; } double operator %(point q) { return x * q.y - y * q.x; } int cmp(point q) const { if (int t = ::cmp(x, q.x)) return t; return ::cmp(y, q.y); } bool operator ==(point q) const { return cmp(q) == 0; } bool operator !=(point q) const { return cmp(q) != 0; } bool operator < (point q) const { return cmp(q) < 0; } }; double seg_distance(point p, point q, point r) { point A = r - q, B = r - p, C = q - p; double a = A * A, b = B * B, c = C * C; if (cmp(b, a + c) >= 0) return sqrt(a); else if (cmp(a, b + c) >= 0) return sqrt(b); else return fabs(A % B) / sqrt(c); } double segs_distance(point p, point q, point r, point s) { return min(min(seg_distance(p, q, r), seg_distance(p, q, s)), min(seg_distance(r, s, p), seg_distance(r, s, q))); } double abs(point p) { return hypot(p.x, p.y); } double arg(point p) { return atan2(p.y, p.x); } int N; double L, H; point Pi[MAX], Pf[MAX]; int main() { int k; double ans; while (scanf(" %d", &N) != EOF) { ans = 1e10; scanf(" %lf %lf", &L, &H); for (k = 0; k < N; k++) { Pi[k].x = (k % 2 == 0) ? 0.0 : L; scanf(" %lf %lf %lf", &Pi[k].y, &Pf[k].x, &Pf[k].y); } for (k = 0; k < N; k++) { if (k % 2 == 0) { ans = min(ans, segs_distance(point(L, 0), point(L, H), Pi[k], Pf[k])); } else { ans = min(ans, segs_distance(point(0, 0), point(0, H), Pi[k], Pf[k])); } if (k > 0) { ans = min(ans, segs_distance(Pi[k], Pf[k], Pi[k-1], Pf[k-1])); } } printf("%.2f\n", ans); } }