#include using ll = long long; using namespace std; struct MinMax{ ll x; ll max, min; }; map m; vector v; unordered_map> results; ll rec(int i, bool max){ if(results[i].find(max) != results[i].end()) return results[i][max]; if(i + 1 == v.size()) { results[i][max] = (v[i].max - v[i].min); return results[i][max]; } ll x_dist = i+1 != v.size() ? (v[i+1].x - v[i].x) : 0; ll dist_min = rec(i+1, false) + (max ? abs(v[i].max - v[i+1].min) : abs(v[i].min - v[i+1].min)) + x_dist; ll dist_max = rec(i + 1, true) + (max ? abs(v[i].max - v[i+1].max) : abs(v[i].min - v[i+1].max)) + x_dist; results[i][max] = (v[i].max - v[i].min) + min(dist_min, dist_max); return results[i][max]; } int main() { ll n; cin >> n; for(int i = 0; i < n ;i++){ ll x, y; cin >> x >> y; auto found = m.find(x); if(found != m.end()){ //je tam found->second.max = max(found->second.max, y); found->second.min = min(found->second.min, y); } else{ m.insert({x, MinMax{x,y, y}}); } } for(auto & i : m) { v.emplace_back(i.second); } cout << min(rec(0, false), rec(0, true)) << endl; }