Problem:
Convex Hull

Find the convex hull of a given set of points P. In other words, find the smallest convex polygon containing all the points of P. Here, in a convex polygon, all interior angles are less than or equal to 180 degrees.

Please note that you should find all the points of P on both corner and boundary of the convex polygon.

Input

n
x1 y1
x2 y2
:
xn yn

The first integer n is the number of points in P. The coordinate of the i-th point pi is given by two integers xi and yi.

Output

In the first line, print the number of points on the corner/boundary of the convex polygon. In the following lines, print x y coordinates of the set of points.
The coordinates should be given in the order of counter-clockwise visit of them starting from the point in P with the minimum y-coordinate, or the leftmost such point in case of a tie.

Constraints

3 ≤ n ≤ 100000

-10000 ≤ xi, yi ≤ 10000

No point in the P will occur more than once.

Sample Input 1

7
2 1
0 0
1 2
2 2
4 2
1 3
3 3

Sample Output 1

5
0 0
2 1
4 2
3 3
1 3

Sample Input 2

4
0 0
2 2
0 2
0 1

Sample Output 2

4
0 0
2 2
0 2
0 1

Solution in Ruby (judge verdict: Accepted)

def ccw(p1, p2, p3)
  return (p2[0] - p1[0])*(p3[1] - p1[1]) - (p2[1] - p1[1])*(p3[0] - p1[0])
end

n = gets.to_i

pt = []
n.times{|i|
  pt[i] = gets.split.map(&:to_f)
}

pt.sort! {|a, b| a[0] == b[0] ? a[1] <=> b[1] : a[0] <=> b[0]}

uh = [pt[0],pt[1]]
lh = [pt[-1],pt[-2]]

2.upto(pt.size-1){|i|
  n = uh.size - 1
  while n >= 1 && ccw(uh[n-1], uh[n], pt[i]) > 0
    uh.pop
    n -= 1
  end
  uh.push(pt[i])
}

(pt.size-3).downto(0){|i|
  n = lh.size - 1
  while n >= 1 && ccw(lh[n-1], lh[n], pt[i]) > 0
    lh.pop
    n -= 1
  end
  lh.push(pt[i])
}

hull = (lh + uh).uniq.reverse

nh = hull.size

start = 0
spt = [hull[0][0], hull[0][1]]
nh.times{|i|
  if hull[i][1] == spt[1] ? hull[i][0] < spt[0] : hull[i][1] < spt[1]
    spt = [hull[i][0], hull[i][1]]
    start = i
  end
}

puts nh
nh.times{|i|
  j = (i+start) % nh
  puts "%d %d" % hull[j]
}