OIG XV - cie

// https://szkopul.edu.pl/problemset/problem/CfC9kdi4CmWqASRq4RjIOcnV/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

// #define GARY_DBG true

typedef vec<vec<int>> _kra;
typedef ar<int, 2> P;
typedef long double ld;

struct Seg {
    ld t1, t2, vk, sx;
    Seg(ld t1, ld t2, ld vk, ld sx) {
        this->t1 = t1;
        this->t2 = t2;
        this->vk = vk;
        this->sx = sx;
    }
};

void solve() {
    int n, A, B;
    std::cin >> n >> A >> B;

    int ddir = 1;
    if (A > B) ddir = -1;

    if (A == B) {
        std::cout << "0.000000000\n";
        return;
    }

    // [-> X, V]
    std::vector<P> v(n);
    for (auto& [a, b] : v) {
        std::cin >> a >> b;
    }
    std::sort(v.begin(), v.end(), [](const P& a, const P& b) { return a[1] < b[1]; });

    std::stack<Seg> s;
    s.push({0, INT_MAX, 0, (ld)abs(B - A)});

    for (const auto& [X, V] : v) {
        ld pos = B;

        while (!s.empty()) {
            const auto [t1, t2, vk, sx] = s.top();
            pos -= ddir * sx;

            ld tm = abs(X - pos) / V, tz = -1, T = -1;

            if (tm >= t1) {
                if (X <= pos) {
                    tz = (pos - (X + t1 * V)) / abs(V - ddir * vk) + t1;
                    T = abs(B - (X + tz * V)) / V + tz;
                } else {
                    tz = ((X - t1 * V) - pos) / abs(V + ddir * vk) + t1;
                    T = abs(B - (X - tz * V)) / V + tz;
                }
            } else {
                tz = tm;
            }

            if (tz <= t1) {
                s.pop();

                if (s.empty()) {
                    ld Tlocal = (ld)abs(B - A) / V;
                    s.push({(ld)0, Tlocal, (ld)V, (ld)abs(B - A)});

                    break;
                }
            } else if (t1 < tz && tz <= t2) {
                s.pop();

                ld sx1 = (tz - t1) * vk, sx2 = (T - tz) * V;
                s.push({t1, tz, vk, sx1});
                s.push({tz, T, (ld)V, sx2});

                break;
            } else {
                break;
            }
        }
    }

    ld ans = s.top().t2;

    std::cout << ans << '\n';
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    std::cout << std::setprecision(9) << std::fixed;

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}