import java.util.* ;
import java.io.*;
public class Solution
{
public static long cross(ArrayList<Integer> p, ArrayList<Integer> q, ArrayList<Integer> r)
{
long ax = (long)(r.get(0) - p.get(0));
long ay =(long)(r.get(1) - p.get(1));
long bx =(long)(q.get(0) - p.get(0));
long by =(long)(q.get(1) - p.get(1));
return (ax * by - ay * bx);
}
public static ArrayList<ArrayList<Integer>> construct(ArrayList<ArrayList<Integer>> Points)
{
Collections.sort(Points, new Comparator<ArrayList<Integer>>() {
public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
int la = a.size();
int lb = b.size();
int i=0,j=0;
while(i<la && j<lb){
if(a.get(i) == b.get(j))
{
i++;j++;
}else if(a.get(i) > b.get(j)){
return 1;
}else{
return -1;
}
}
return 0;
}
});
int n = Points.size();
ArrayList<ArrayList<Integer>> up = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> down = new ArrayList<ArrayList<Integer>>();
up.add(Points.get(0));
up.add(Points.get(1));
for (int i = 2; i < n; i++)
{
while (up.size() >= 2)
{
int m = up.size();
if (cross(up.get(m - 1), up.get(m - 2), Points.get(i)) > 0)
{
int idx = m - 1;
up.remove(idx);
}
else
{
break;
}
}
up.add(Points.get(i));
}
down.add(Points.get(n - 1));
down.add(Points.get(n - 2));
for (int i = n - 3; i >= 0; i--)
{
while (down.size() >= 2)
{
int m = down.size();
if (cross(down.get(m - 1), down.get(m - 2), Points.get(i)) > 0)
{
int idx = down.size() - 1;
down.remove(idx);
}
else
{
break;
}
}
down.add(Points.get(i));
}
HashSet<ArrayList<Integer>> s = new HashSet<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
for (ArrayList<Integer> i : up)
{
if (s.contains(i) == false)
{
ans.add(i);
s.add(i);
}
}
for (ArrayList<Integer> i : down)
{
if (s.contains(i) == false)
{
ans.add(i);
s.add(i);
}
}
Collections.sort(ans, new Comparator<ArrayList<Integer>>() {
public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
int la = a.size();
int lb = b.size();
int i=0,j=0;
while(i<la && j<lb){
if(a.get(i) == b.get(j))
{
i++;j++;
}else if(a.get(i) > b.get(j)){
return 1;
}else{
return -1;
}
}
return 0;
}
});
return ans;
}
}

