#include using namespace std; typedef long long ll; struct point { ll x, y; point(ll x=0, ll y=0): x(x), y(y) {} point operator-(const point &p) const { return point(x-p.x, y-p.y); } point operator*(const ll k) const { return point(k*x, k*y); } ll cross(const point &p) const { return x*p.y - p.x*y; } bool operator<(const point &p) const { return x < p.x || x == p.x && y < p.y; } }; bool above(vector &hull, point p, ll scale = 1) { auto it = lower_bound(hull.begin(), hull.end(), point((p.x+scale-1)/scale, 0)); if (it == hull.end()) return true; if (p.y <= it->y*scale) return false; if (it == hull.begin()) return true; auto jt = it--; point dp = p - *it * scale; point dq = *jt - *it; if (-dp.y > (1LL<<61)/dq.x) return false; return dp.cross(dq) < 0; } void make_hull(vector &pts) { sort(pts.begin(), pts.end()); int sz = 0; for (int i = 0; i < pts.size(); pts[sz++] = pts[i++]) { while ((sz >= 1 && pts[i].y >= pts[sz-1].y) || (sz >= 2 && (pts[sz-1]-pts[sz-2]).cross(pts[i]-pts[sz-2]) >= 0)) --sz; } pts.resize(sz); } int main(void) { int n; scanf("%d", &n); vector points(n); for (auto &p: points) scanf("%lld%lld", &p.x, &p.y); int e; scanf("%d", &e); vector quit(n, 0); vector> queries(e); for (auto &query: queries) { char type[10]; scanf("%s", type); if (*type == 'c') scanf("%lld%lld%lld", &query.first, &query.second.x, &query.second.y); else { scanf("%lld", &query.first); quit[--query.first] = 1; query = make_pair(-1, points[query.first]); } } vector hull, add; for (int i = 0; i < n; ++i) if (!quit[i]) add.push_back(points[i]); vector ans; reverse(queries.begin(), queries.end()); for (auto &query: queries) { if (query.first == -1) add.push_back(query.second); else { if (!above(hull, query.second, query.first)) ans.push_back(false); else if (!add.empty()) { for (const auto &p: add) hull.push_back(p); add.clear(); make_hull(hull); ans.push_back(above(hull, query.second, query.first)); } else ans.push_back(true); } } reverse(ans.begin(), ans.end()); for (auto &a: ans) printf("%s\n", a ? "yes" : "no"); }