Problem:
問題 ４

　平面上の n 個の点 P1, ..., Pn が与えられたとき，
距離が最小の２点を求めたい．

　入力ファイルの１行目には整数 n が書いてある．
２行目から n+1 行目のそれぞれには，
２つの正整数 x, y が１つの半角空白文字を区切りとして書いてある．
i+1 行目の x, y はそれぞれ Pi の x 座標，
Pi の y 座標である．
これら n 点の中から最も近い２点を選んだとき，
この２点間の距離の２乗を出力せよ．

　ただし，
2≤n≤500000 かつ -10000≤x≤10000, -10000≤y≤10000 とし，
５つの入力ファイルのうち３つでは n≤100 である．
また，どの入力ファイルにおいても，全ての座標は異なるものとする．

出力ファイルにおいては，
出力の最後の行にも改行コードを入れること．

入出力例

入力例１

2
0 0
1 1

出力例１

2

入力例２

3
5 5
0 0
-3 -4

出力例２

25

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Ruby (judge verdict: Accepted)

## subroutines

def dist2(p0, p1)
  (p1[0] - p0[0]) ** 2 + (p1[1] - p0[1]) ** 2
end

def pdist_rec(i, j)
  ij = j - i
  return 0 if ij <= 1
  return dist2($pts[i], $pts[i + 1]) if ij == 2

  if ij == 3
    return [dist2($pts[i], $pts[i + 1]),
            dist2($pts[i + 1], $pts[i + 2]),
            dist2($pts[i + 2], $pts[i])].min
  end

  k = (i + j) / 2
  d2 = [pdist_rec(i, k), pdist_rec(k, j)].min
  d = Math.sqrt(d2 + 0.5).to_i

  midx = $pts[k][0]
  spts = []

  (k - 1).downto(i) do |i0|
    break if midx - $pts[i0][0] >= d
    spts << $pts[i0]
  end

  for j0 in (k...j)
    break if $pts[j0][0] - midx >= d
    spts << $pts[j0]
  end

  spts.sort!{|a, b| a[1] <=> b[1]}
  nspts = spts.length

  for i0 in (0...nspts)
    for j0 in ((i0 + 1)...nspts)
      break if spts[j0][1] - spts[i0][1] >= d
      sd2 = dist2(spts[i0], spts[j0])
      if d2 > sd2
        d2 = sd2
        d = Math.sqrt(d2 + 0.5).to_i
      end
    end
  end

  d2
end

### main

n = gets.strip.to_i

$pts = n.times.map{gets.strip.split(' ').map{|s| s.to_i}}.sort
#p $pts

d2 = pdist_rec(0, n)
puts d2