void add_point_to_vertexs(set<Point> &vertexs, Point px)
{
for (p1 : vertexs)
for (p2 : vertexs)
if (((p2.x - p1.x) * (px.y - p1.y) - (p2.y - p1.y) * (px.x - p1.x)) == 0 &&
((p2.x - p1.x) * (px.x - p1.x) + (p2.y - p1.y) * (px.y - p1.y)) > 0 &&
((p2.x - p1.x - px.x) * (px.x - p1.x) + (p2.y - p1.y - px.y) * (px.y - p1.y)) <= 0)
vertexs.erase(p2); // p2 lies on line(p1, px)
vertexs.push(px);
}
dm9pZCBhZGRfcG9pbnRfdG9fdmVydGV4cyhzZXQ8UG9pbnQ+ICZ2ZXJ0ZXhzLCBQb2ludCBweCkKewogIGZvciAocDEgOiB2ZXJ0ZXhzKQogICAgZm9yIChwMiA6IHZlcnRleHMpCiAgICAgIGlmICgoKHAyLnggLSBwMS54KSAqIChweC55IC0gcDEueSkgLSAocDIueSAtIHAxLnkpICogKHB4LnggLSBwMS54KSkgPT0gMCAmJgogICAgICAgICAgKChwMi54IC0gcDEueCkgKiAocHgueCAtIHAxLngpICsgKHAyLnkgLSBwMS55KSAqIChweC55IC0gcDEueSkpID4gMCAmJgogICAgICAgICAgKChwMi54IC0gcDEueCAtIHB4LngpICogKHB4LnggLSBwMS54KSArIChwMi55IC0gcDEueSAtIHB4LnkpICogKHB4LnkgLSBwMS55KSkgPD0gMCkKICAgICAgICB2ZXJ0ZXhzLmVyYXNlKHAyKTsgLy8gcDIgbGllcyBvbiBsaW5lKHAxLCBweCkKCiAgdmVydGV4cy5wdXNoKHB4KTsKfQo=