Scanf.scanf "%d" (fun n ->
    let xy = Array.init n (fun i -> Scanf.scanf " %d %d" (fun x y -> x, y, i)) in
    Array.sort compare xy;
    let module S = Set.Make (struct type t = int * int * int let compare = compare end) in
    let rec loop j acc =
        if j = n then acc else
            let px, _, pi = xy.(j - 1) in
            let cx, _, ci = xy.(j)     in
            let acc = S.add (cx - px, pi, ci) acc in
            loop (j + 1) acc
    in
    let edges = loop 1 S.empty in
    Array.sort (fun (x0, y0, _) (x1, y1, _) -> compare (y0, x0) (y1, x1)) xy;
    let rec loop j acc =
        if j = n then acc else
            let _, py, pi = xy.(j - 1) in
            let _, cy, ci = xy.(j)     in
            let acc = S.add (cy - py, pi, ci) acc in
            loop (j + 1) acc
    in
    let edges = loop 1 edges in

    let par = Array.init n (fun i -> i) in
    let rec root x =
        if x = par.(x) then x else
            let r = root par.(x) in
            let () = par.(x) <- r in
            r
    in

    let merge a b =
        if root a <> root b then par.(par.(b)) <- par.(a)
    in

    let rec loop edges cost =
        if S.is_empty edges then cost else (
            let ((c, n1, n2) as elt) = S.min_elt edges in
            let edges = S.remove elt edges in
            if root n1 = root n2 then loop edges cost else (
                merge n1 n2;
                loop edges (cost + c)
            )
        )
    in
    loop edges 0 |> Printf.printf "%d\n"
)
