#include <bits/stdc++.h>
#define ll long long
#define MAXN 200010
using namespace std;
vector<pair<ll,ll> > cp(MAXN),dp(MAXN);
ll n;
void All()
{
    for (ll i=0;i<=n;i++)
        cp[i]=make_pair(INT_MAX,INT_MIN);
}
int main()
{
    ///ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll x,c;
    cin >> n;
    All();
    dp[0].first=0;
    dp[0].second=0;
    ///for (ll i=1;i<=n;i++)
    ///{
    ///    cout << i << " cp " << cp[i].first << " " << cp[i].second << "\n";
    ///}
    for (ll i=1;i<=n;i++)
    {
        cin >> x >> c;
        cp[c].first=min(cp[c].first,x);
        cp[c].second=max(cp[c].second,x);
    }
    /**for (ll i=1;i<=n;i++)
    {
        if (cp[i].first==INT_MAX)
            continue;
        cout << i << " cp " << cp[i].first << " " << cp[i].second << "\n";
    }**/
    ll p=0;
    cp[p].first=0;
    cp[p].second=0;
    for (ll i=1;i<=n;i++)
    {
        if (cp[i].first==INT_MAX)
            continue;
        dp[i].first=min(dp[p].first+abs(cp[p].first-cp[i].second),dp[p].second+abs(cp[p].second-cp[i].second))+abs(cp[i].first-cp[i].second);
        dp[i].second=min(dp[p].first+abs(cp[p].first-cp[i].first),dp[p].second+abs(cp[p].second-cp[i].first))+abs(cp[i].first-cp[i].second);
        p=i;
    }
    cout << min(dp[p].first+abs(cp[p].first),dp[p].second+abs(cp[p].second)) << "\n";
    return 0;
}

//インクルード(アルファベット順)
#ifndef TEMPLATE
#define TEMPLATE
#include<algorithm>//sort,二分探索,など
#include<bitset>//固定長bit集合
#include<cmath>//pow,logなど
#include<ctime>
#include<complex>//複素数
#include<deque>//両端アクセスのキュー
#include<functional>//sortのgreater
#include<iomanip>//setprecision(浮動小数点の出力の誤差)
#include<iostream>//入出力
#include<iterator>//集合演算(積集合,和集合,差集合など)
#include<map>//map(辞書)
#include<numeric>//iota(整数列の生成),gcdとlcm(c++17)
#include<queue>//キュー
#include<set>//集合
#include<stack>//スタック
#include<string>//文字列
//#include<unordered_map>//イテレータあるけど順序保持しないmap
//#include<unordered_set>//イテレータあるけど順序保持しないset
#include<utility>//pair
#include<vector>//可変長配列
#include<valarray>//なんとなく追加
//メモ：表示桁数を大きくする　　cout << fixed << setprecision(20) << cm << endl;
#include<cstdint>
using namespace std;
typedef long long ll;

//マクロ
//forループ関係
//引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
//xにはvectorなどのコンテナ
#define ALL(x) (x).begin(),(x).end() //sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size()) //sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x)) //最大値を求める
#define MIN(x) *min_element(ALL(x)) //最小値を求める
//定数
#define INF 1000000000000 //10^12:極めて大きい値,∞
#define MOD 1000000007 //10^9+7:合同式の法
#define MAXR 100000 //10^5:配列の最大のrange(素数列挙などで使用)
//略記
#define PB push_back //vectorヘの挿入
#define MP make_pair //pairのコンストラクタ
#define F first //pairの一つ目の要素
#define S second //pairの二つ目の要素
#define PI acos(-1.0)
#define answer(ans) cout<<ans<<endl;
#define input(N) cin >> N ;

#endif // TEMPLATE

int main(){
    ll N;
    cin >> N;
    vector<ll> X(N),C(N);
    REP(i,N){
        cin >> X[i] >> C[i];
    }
    vector<pair<ll,ll> > p(N);
    REP(i,N){
        p[i].first=C[i];
        p[i].second=X[i];
    }
    sort(p.begin(),p.end());
    ll count=1;
    ll tmp=p[0].first;
    vector<ll> l,r;
    l.push_back(p[0].second);
    REP(i,N){
        if(p[i].first!=tmp){
            count++;
            tmp=p[i].first;
            r.push_back(p[i-1].second);
            l.push_back(p[i].second);
    //        cout << p[i-1].second << " " <<p[i].second << endl;
        }
    }
    r.push_back(p[N-1].second);
    
    ll dp[count+1][2];
    dp[0][0]=0;
    dp[0][1]=0;
    ll nowl=0,nowr=0;
    for(ll i=1;i<count+1;i++){
        dp[i][0]=min(dp[i-1][0] + abs(r[i-1]-nowl)+abs(l[i-1]-r[i-1]),dp[i-1][1] + abs(r[i-1]-nowr)+abs(l[i-1]-r[i-1]));
        dp[i][1]=min(dp[i-1][0] + abs(l[i-1]-nowl)+abs(r[i-1]-l[i-1]),dp[i-1][1] + abs(l[i-1]-nowr)+abs(r[i-1]-l[i-1]));
        nowl=l[i-1];
        nowr=r[i-1];
    }
    ll ans = min(dp[count][0]+abs(nowl) , dp[count][1]+abs(nowr));
    //    answer("cout dp");
    //REP(i,4){
    //    cout << dp[i][0] << " " << dp[i][1] << endl;
   //}
    answer(ans);

    return 0;
}
