#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
typedef vector<ll> VI;
typedef vector<VI> VVI;
#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
constexpr ll MOD=998244353;
constexpr ll INF=2e18;

int main(){
    int n; cin >> n;
    vector<P> p(n);
    REP(i,n) cin >> p[i].second >> p[i].first;
    sort(ALL(p));
    int now=-1;
    vector<P> q;
    REP(i,n){
        if(i==0||p[i-1].first!=p[i].first){
            now++;
            q.push_back({p[i].second,p[i].second});
        }
        else{
            q[now].first=min(q[now].first,p[i].second);
            q[now].second=max(q[now].second,p[i].second);
        }
    }
    int m=q.size();
    VVI dp(m+1,VI(2,INF));
    REP(i,m){
        if(i==0){
            dp[i+1][0]=abs(0-q[i].second)+abs(q[i].first-q[i].second);
            dp[i+1][1]=abs(0-q[i].first)+abs(q[i].first-q[i].second);
        }
        else{
            dp[i+1][0]=min(dp[i][0]+abs(q[i-1].first-q[i].second)+abs(q[i].first-q[i].second),dp[i][1]+abs(q[i-1].second-q[i].second)+abs(q[i].first-q[i].second));
            dp[i+1][1]=min(dp[i][0]+abs(q[i-1].first-q[i].first)+abs(q[i].first-q[i].second),dp[i][1]+abs(q[i-1].second-q[i].first)+abs(q[i].first-q[i].second));
        }
    }
    cout << min(dp[m][0]+abs(q[m-1].first),dp[m][1]+abs(q[m-1].second)) << endl;
    return 0;
}
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#pragma comment(linker, "/stack:200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//turn on extra precision
//#pragma GCC target("fpmath=387")

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef string str;
typedef pair <int,int> pii;
typedef pair <ll,ll> pll;
typedef vector <int> vi;
typedef vector <ll> vll;
typedef vector <pii> vpii;
typedef vector <pll> vpll;

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define ordered_multiset tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
#define mp make_pair
#define pb push_back
#define pob pop_back
#define pf push_front
#define pof pop_front
#define fi first
#define se second
#define fs first.second
#define ss second.second
#define ff first.first
#define sf second.first
#define newl '\n'
#define fbo find_by_order
#define ook order_of_key
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(),x.rend()
#define watch(x) cout << (#x) << " is : " << (x) << newl

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
vi dirx = {0,0,1,-1};
vi diry = {1,-1,0,0};
char to_upper (char x){
    if( 97 <= int(x) && int(x) <= 122) return char(x-32);
    if( 65 <= int(x) && int(x) <= 90) return x;
    return -1;
}
char to_lower (char x){
    if( 97 <= int(x) && int(x) <= 122) return x;
    if( 65 <= int(x) && int(x) <= 90) return char(x+32);
    return -1;
}
int numerize (char x){
    if(48 <= int(x) && int(x) <= 57) return int(x-'0');
    if(97 <= int(x) && int(x) <= 122) return int(x-96);
    if(65 <= int(x) && int(x) <= 90) return int(x-64);
    return -1;
}
bool isect (int l1, int r1, int l2, int r2){ return max(l1,l2) <= min(r1,r2); }
ll quickpow (ll num1, ll num2, ll MOD){
    if(num2==0)return 1%MOD;
    else if(num2==1)return num1%MOD;
    else{
        ll temp = quickpow (num1,num2>>1LL,MOD); ll res = ((temp%MOD) * (temp%MOD))%MOD;
        if(num2&1) res = ((res%MOD)*(num1%MOD))%MOD; return res;
    }
}
ll invmod (ll num, ll MOD){return quickpow (num,MOD-2,MOD);}
ll gcd (ll num1, ll num2){
    if(num1 < num2) swap(num1,num2); ll num3 = num1 % num2 ;
    while(num3 > 0){ num1 = num2; num2 = num3; num3 = num1 % num2;}
    return num2;
}
ll lcm (ll num1 , ll num2){return (ll) (num1/__gcd(num1,num2))*num2;}
// end of Template

int n, c[200010], x[200010];
ll dp[200010][2];
pii p[200010];
void compress(){
    set <int> s;
    for(int i = 1; i <= n; ++i) s.insert(c[i]);
    map <int,int> trans;
    int idx = 0;
    for(auto i : s) trans[i] = ++idx;
    for(int i = 1; i <= n; ++i) c[i] = trans[c[i]];
    for(int i = 1; i <= n; ++i){
        if(p[c[i]] == mp(0,0)){ p[c[i]] = mp(x[i],x[i]); }
        else {p[c[i]].se = max(p[c[i]].se, x[i]); p[c[i]].fi = min(p[c[i]].fi, x[i]); }
    }
    n = idx;
    return;
}
ll cost(ll a, ll b, ll c){
    return abs(a-b) + abs(b-c);
}
int main(){

//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for(int i = 1; i <= n; ++i) cin >> x[i] >> c[i];
    compress();

    dp[0][0] = 0, dp[0][1] = 0;
    for(int i = 1; i <= n; ++i){
        dp[i][0] = min(dp[i-1][0] + cost(p[i-1].fi,p[i].se,p[i].fi) , dp[i-1][1] + cost(p[i-1].se,p[i].se,p[i].fi));
        dp[i][1] = min(dp[i-1][0] + cost(p[i-1].fi,p[i].fi,p[i].se) , dp[i-1][1] + cost(p[i-1].se,p[i].fi,p[i].se));
    }

    ll ans = min(dp[n][0] + abs(p[n].fi) , dp[n][1] + abs(p[n].se));
    cout << ans << newl;

    return 0;
}
