typedef vector <pnt> vpnt;
inline bool pless( const pnt &a, const pnt &b )
{
ll x = a * b;
return x != 0 ? x < 0 : a.d2() < b.d2();
}
vpnt ConvexHull( vpnt p )
{
int n = sz(p), mi = 0;
assert(n > 0);
forn(i, n)
if (p[mi] < p[i])
mi = i;
swap(p[0], p[mi]);
forab(i, 1, n - 1)
p[i] = p[i] - p[0];
sort(p.begin() + 1, p.end(), pless);
int rn = 0;
vpnt r(n);
r[rn++] = p[0];
forab(i, 1, n - 1)
{
pnt q = p[i] + p[0];
while (rn >= 2 && (r[rn - 1] - r[rn - 2]) * (q - r[rn - 2]) >= 0)
rn--;
r[rn++] = q;
}
r.resize(rn);
return r;
}