#include <bits/stdc++.h>
using namespace std;
#define lazy cin.tie(0)->sync_with_stdio(0), cout.tie(0)
#define int long long
#define i128 __int128_t
int LIMIT = 1000000000000000000LL;
/*
x = ((t + t/B) % A)
t/B -> t = (t/B) * B + t%B
t = (t/B) * B + y
x=((t/B) * B + y + (t/B))%A
x =((t/B)*(B+1)+y)modA
y = t % B
when B = 3
for entire t:
120120120...
(l to r)
t2 - t1 = k * B ?
use gcd
k ->> A/ (A,B+1) - > P = B * gcd(A,B+1) A????
*/
signed main() {
lazy;
int n;
int A, B;
cin >> n >> A >> B;
int g = std::gcd(A, B + 1);
i128 P128 = (i128)(A / g) * B;
vector<pair<int, int>> segs;
segs.reserve(2LL * n);
int total_len = 0;
if (P128 > LIMIT) {
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
total_len += r - l + 1;
}
cout << total_len << '\n';
return 0;
}
int P = (int)P128;
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
int len = r - l + 1;
if (len >= P) {
cout << P << '\n';
return 0;
}
int start = l % P;
int end = start + len - 1;
if (end < P) {
segs.push_back({start, end});
} else {
segs.push_back({start, P - 1});
segs.push_back({0, end % P});
}
}
sort(segs.begin(), segs.end());
int ans = 0;
int cur_l = -1;
int cur_r = -1;
for (auto [l, r] : segs) {
if (cur_l == -1) {
cur_l = l;
cur_r = r;
} else if (l <= cur_r + 1) {
cur_r = max(cur_r, r);
} else {
ans += cur_r - cur_l + 1;
cur_l = l;
cur_r = r;
}
}
if (cur_l != -1) {
ans += cur_r - cur_l + 1;
}
cout << ans << '\n';
return 0;
}