#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y, ag;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(const Point &B) const { return Point(x + B.x, y + B.y); }
  Point operator-(const Point &B) const { return Point(x - B.x, y - B.y); }
  double operator*(const Point &B) const { return x * B.y - y * B.x; }
} P[3], O;
struct node {
  bool operator()(const Point &A, const Point &B) { return A.ag < B.ag; }
};
set<Point, node> st;
set<Point, node>::iterator pre, nxt, ppre, nnxt;
int main() {
  int q, op, x, y;
  scanf("%d", &q);
  q -= 3;
  scanf("%d%lf%lf", &op, &P[0].x, &P[0].y);
  scanf("%d%lf%lf", &op, &P[1].x, &P[1].y);
  scanf("%d%lf%lf", &op, &P[2].x, &P[2].y);
  O.x = (P[0].x + P[1].x + P[2].x) / 3;
  O.y = (P[0].y + P[1].y + P[2].y) / 3;
  for (int i = 0; i < 3; i++) P[i] = P[i] - O, P[i].ag = atan2(P[i].y, P[i].x);
  st.insert(P[0]), st.insert(P[1]), st.insert(P[2]);
  for (; q--;) {
    scanf("%d%lf%lf", &op, &P[0].x, &P[0].y);
    P[0] = P[0] - O;
    P[0].ag = atan2(P[0].y, P[0].x);
    if (op == 1) {
      nxt = st.lower_bound(P[0]), pre = nxt;
      if (pre == st.begin()) pre = st.end();
      pre--;
      if (nxt == st.end()) nxt = st.begin();
      if (((*nxt) - (*pre)) * ((*nxt) - P[0]) > 1e-5) {
        for (; st.size() >= 2; st.erase(*nxt), nxt = nnxt) {
          nnxt = nxt, nnxt++;
          if (nnxt == st.end()) nnxt = st.begin();
          if (((*nnxt) - (*nxt)) * ((*nxt) - P[0]) < 1e-5) break;
        }
        for (; st.size() >= 2; st.erase(*pre), pre = ppre) {
          ppre = pre;
          if (ppre == st.begin()) ppre = st.end();
          ppre--;
          if ((P[0] - (*pre)) * ((*pre) - (*ppre)) < 1e-5) break;
        }
        st.insert(P[0]);
      }
    } else {
      nxt = st.lower_bound(P[0]), pre = nxt;
      if (pre == st.begin()) pre = st.end();
      pre--;
      if (nxt == st.end()) nxt = st.begin();
      if (((*nxt) - (*pre)) * ((*nxt) - P[0]) > 1e-5)
        puts("NO");
      else
        puts("YES");
    }
  }
}
