e809224685e799fbc90571f0af11a8b3c8a7390bbe75397d876ea582c85ef732
// 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;
}