Problem:
Score : 500 points

Problem Statement

There are N towns on a plane. The i-th town is located at the coordinates (x_i,y_i). There may be more than one town at the same coordinates.

You can build a road between two towns at coordinates (a,b) and (c,d) for a cost of min(|a-c|,|b-d|) yen (the currency of Japan). It is not possible to build other types of roads.

Your objective is to build roads so that it will be possible to travel between every pair of towns by traversing roads. At least how much money is necessary to achieve this?

Constraints

2 ≤ N ≤ 10^5

0 ≤ x_i,y_i ≤ 10^9

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
:
x_N y_N

Output

Print the minimum necessary amount of money in order to build roads so that it will be possible to travel between every pair of towns by traversing roads.

Sample Input 1

3
1 5
3 9
7 8

Sample Output 1

3

Build a road between Towns 1 and 2, and another between Towns 2 and 3. The total cost is 2+1=3 yen.

Sample Input 2

6
8 3
4 9
12 19
18 1
13 5
7 6

Sample Output 2

8

Solution in Ruby (2.3.3) (judge verdict: Accepted)

def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

class UnionFindTree
  attr_accessor:par,:rank
  def initialize(n)
    @par=Array.new(n){|i| i}
    @rank=array(n,1,0)
  end

  def find(x)
    return x if @par[x]==x
    @par[x]=find(@par[x])
    return @par[x]
  end

  def union(x,y)
    x=find(x)
    y=find(y)
    return if x==y
    if @rank[x]<@rank[y]
      @par[x]=y
    else
      @par[y]=x
      @rank[x]+=1 if @rank[x]==@rank[y]
    end
  end

  def same?(x,y)
    return find(x)==find(y)
  end
end

class Edge
  attr_accessor:to,:from,:c
  def initialize(from,to,cost)
    @from=from
    @to=to
    @c=cost
  end
end

n=gets.to_i
edges=array(2*(n-1),1)
x_arr=array(2,n)
y_arr=array(2,n)
n.times do|i|
  x,y=get_i
  x_arr[i]=[x,i]
  y_arr[i]=[y,i]
end
x_arr.sort!{|a,b| a[0]<=>b[0]}
y_arr.sort!{|a,b| a[0]<=>b[0]}
(n-1).times do|i|
  edges[i]=Edge.new(x_arr[i][1],x_arr[i+1][1],(x_arr[i+1][0]-x_arr[i][0]))
end
(n-1).times do|i|
  edges[i+n-1]=Edge.new(y_arr[i][1],y_arr[i+1][1],(y_arr[i+1][0]-y_arr[i][0]))
end
uft=UnionFindTree.new(n)
edges.sort!{|a,b| a.c<=>b.c}
ans=0
m=edges.size
m.times do|i|
  e=edges[i]
  unless uft.same?(e.to,e.from)
    uft.union(e.to,e.from)
    ans+=e.c
  end
end
puts ans