#pragma GCC optimize("O2") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define int ll #define INT128_MAX (__int128)(((unsigned __int128) 1 << ((sizeof(__int128) * __CHAR_BIT__) - 1)) - 1) #define INT128_MIN (-INT128_MAX - 1) #define clock chrono::steady_clock::now().time_since_epoch().count() #ifdef DEBUG #define dbg(x) cout << (#x) << " = " << x << '\n' #else #define dbg(x) #endif namespace R = std::ranges; namespace V = std::views; using namespace std; using ll = long long; using ull = unsigned long long; using ldb = long double; using pii = pair; using pll = pair; //#define double ldb template ostream& operator<<(ostream& os, const pair pr) { return os << pr.first << ' ' << pr.second; } template ostream& operator<<(ostream& os, const array &arr) { for(const T &X : arr) os << X << ' '; return os; } template ostream& operator<<(ostream& os, const vector &vec) { for(const T &X : vec) os << X << ' '; return os; } template ostream& operator<<(ostream& os, const set &s) { for(const T &x : s) os << x << ' '; return os; } signed main() { ios::sync_with_stdio(false), cin.tie(NULL); int n; cin >> n; vector> lr(n); for(auto &[l, r] : lr) cin >> l >> r; auto check = [&](vector> seg) { ranges::sort(seg); priority_queue, greater> pq; for(int i = 1, ptr = 0; i <= n; i++) { while(ptr < n and seg[ptr][0] == i) pq.push(seg[ptr++][1]); if (pq.empty() or pq.top() < i) return false; pq.pop(); } return true; }; int l = *ranges::partition_point(views::iota(-n, INT_MAX), [&](int x) { vector> v(n); for(int i = 0; i < n; i++) v[i] = {max(1, lr[i][0] - x), n}; return !check(v); }); if (l == INT_MAX) { cout << 0 << '\n'; return 0; } int r = *ranges::partition_point(views::iota(l, INT_MAX), [&](int x) { vector> v(n); for(int i = 0; i < n; i++) v[i] = {max(1, lr[i][0] - x), min(n, lr[i][1] - x)}; return check(v); }); cout << r - l << '\n'; return 0; }