// #pragma GCC target("avx") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; #define rep(i,n) for(int i = 0; i < (int)n; i++) #define FOR(n) for(int i = 0; i < (int)n; i++) #define repi(i,a,b) for(int i = (int)a; i < (int)b; i++) #define all(x) x.begin(),x.end() //#define mp make_pair #define vi vector #define vvi vector #define vvvi vector #define vvvvi vector #define pii pair #define vpii vector> template bool chmax(T &a, const T b) {if(a bool chmin(T &a, const T b) {if(a>b) {a=b; return true;} else {return false;}} using ll = long long; using ld = long double; using ull = unsigned long long; const ll INF = numeric_limits::max() / 2; const ld pi = 3.1415926535897932384626433832795028; const ll mod = 998244353; int dx[] = {1, 0, -1, 0, -1, -1, 1, 1}; int dy[] = {0, 1, 0, -1, -1, 1, -1, 1}; #define int long long void solve() { int n; cin >> n; vi l(n), r(n); FOR(n) cin >> l[i] >> r[i]; vector order(n); iota(all(order), 0); sort(all(order), [&](int i, int j) -> bool { return l[i] < l[j]; }); int left = -1, right = INF; FOR(n) if(l[i] == 1) chmin(right, r[i]+1); while(right-left > 1) { int mid = (left+right)/2; vi old_l = l, old_r = r; FOR(n) { l[i] -= mid; r[i] -= mid; chmax(l[i], 1LL); } multiset mt; int id = 0; bool flag = true; repi(i, 1, n+1) { while(id < n && l[order[id]] == i) { mt.insert(r[order[id]]); ++id; } if(*mt.begin() < i) { flag = false; break; } mt.erase(mt.begin()); } l = old_l; r = old_r; if(flag) left = mid; else right = mid; } cout << left+1 << endl; } signed main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }