} inline void addPoint(mii &a, const point &p) { // `no collinear points`
	int x = p.x, y = p.y; mit pnt = a.insert(make_pair(x, y)).first, p1, p2;
	for (pnt->y = y; ; a.erase(p2)) {
		p1 = pnt; if (++p1 == a.end()) break;
		p2 = p1;  if (++p1 == a.end()) break;
		if (det(point(p2) - p, point(p1) - p) < 0) break;
	} for ( ; ; a.erase(p2)) {
		if ((p1 = pnt) == a.begin()) break;
		if (--p1 == a.begin()) break; p2 = p1--;
		if (det(point(p2) - p, point(p1) - p) > 0) break;
	}
}
inline bool checkInside(mii &a, const point &p) { // `border inclusive`
	int x = p.x, y = p.y; mit p1 = a.lower_bound(x);
	if (p1 == a.end()) return false; if (p1->x == x) return y <= p1->y;
	if (p1 == a.begin()) return false; mit p2(p1--);
	return sign(det(p - point(p1), point(p2) - p)) >= 0;
} inline void addPoint(mii &a, const point &p) { // `no collinear points`