Convex convex_hull(Convex a) { Convex res(2 * a.size() + 5); sort(a.begin(), a.end(), comp_less); a.erase(unique(a.begin(), a.end()), a.end()); int m = 0; for (int i = 0; i < a.size(); i++) { while (m > 1 && sgn(cross(res[m-1]-res[m-2], a[i]-res[m-2])) <= 0) { m--; } res[m++] = a[i]; } int k = m; for (int i = a.size() - 2; i >= 0; i--) { while (m > k && sgn(cross(res[m-1]-res[m-2], a[i]-res[m-2])) <= 0) { m--; } res[m++] = a[i]; } res.resize(m); if (a.size() > 1) { res.resize(m-1); } return res; }