#include<bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <chrono> 
// using namespace std::chrono; 
// using namespace __gnu_pbds;

#define ff              first
#define ss              second
#define int             long long
#define double          long double
#define pb              push_back
#define mp              make_pair
#define pi              pair<int,int>
#define vtiii           vector<tuple<int,int,int>>
#define vi              vector<int>
#define vpii            vector<pair<int,int>
#define mii             map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int>>
#define setbits(x)      __builtin_popcountll(x)
#define zrobits(x)      __builtin_ctzll(x)
#define inf             1e18  
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define all(x) (x).begin(), (x).end()
#define FIO             ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) 
mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif

void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(double t) {cerr << t;}

template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
 
const int N = 1e7 + 10;
const int mod = 1e9 + 7 ;

int n;

int check(int m,vector<pair<int,int>> vb){
    int taken = 0;
    for(auto &p : vb){
        if(taken >= m) break;
        if(taken > p.ff) break;
        int can_take = min(m-taken , min(p.ff - taken , p.ss));
        p.ss -= can_take;
        taken += can_take;
    }
    if(taken < m) return 2;
    sort(all(vb));
    // debug(taken);
    // debug(vb);
    for(auto &p : vb){
        if(p.ss == 0 ) continue;
        if(taken >= p.ff){
            taken += p.ss;
            continue;
        }
        return 1;
    }
    return 0;
}


void solve(){
    cin>>n;
    vector<pair<int,int>> vb(n);
    int sum = 0;
    for(int i=0;i<n;++i){
        cin>>vb[i].ss>>vb[i].ff;
        sum += vb[i].ss;
    }
    sort(all(vb),greater<pair<int,int>>());
    debug(vb);
    int s = 1 , e = sum , m , p=0;
    while(s<=e){
        m = (s+e)/2;
        int b = check(m,vb);
        // cout<<m<<" "<<b<<endl;
        if(b==0){
            p = m;
            e = m-1;
        }else if(b==1){
            s  = m + 1;
        }else{
            e = m - 1;
        }
    } 
    // cout<<"x"<<endl;
    // cout<<p<<endl;
    cout<< p*2ll + (sum-p);
}        
    
int32_t main(){
    // auto start = high_resolution_clock::now()
    FIO;
    #ifndef ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
        freopen("Error.txt", "w", stderr);
    #endif
    // precalc();
    // int x; cin>>x; while(x--)
    solve();
    // auto stop = high_resolution_clock::now(); 
    // auto duration = duration_cast<microseconds>(stop - start); 
    // cout << duration.count() << endl;
}