#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  long long d;
  double z;
} o, a[5], p;
bool operator<(const point &a, const point &b) {
  return a.z < b.z || (a.z == b.z && a.d < b.d);
}
long long cross(point o, point a, point b) {
  return (long long)(a.x - o.x) * (b.y - o.y) -
         (long long)(a.y - o.y) * (b.x - o.x);
}
set<point> st;
set<point>::iterator L(set<point>::iterator x) {
  if (x == st.begin()) x = st.end();
  x--;
  return x;
}
set<point>::iterator R(set<point>::iterator x) {
  x++;
  if (x == st.end()) x = st.begin();
  return x;
}
int q, op;
int main() {
  scanf("%d", &q);
  for (int i = 0; i < 3; i++) {
    scanf("%d%d%d", &op, &a[i].x, &a[i].y);
    o.x += a[i].x;
    o.y += a[i].y;
    a[i].x *= 3;
    a[i].y *= 3;
  }
  for (int i = 0; i < 3; i++) {
    a[i].d = (long long)(a[i].x - o.x) * (a[i].x - o.x) +
             (long long)(a[i].y - o.y) * (a[i].y - o.y);
    a[i].z = atan2(a[i].y - o.y, a[i].x - o.x);
    st.insert(a[i]);
  }
  q -= 3;
  while (q--) {
    scanf("%d%d%d", &op, &p.x, &p.y);
    p.x *= 3;
    p.y *= 3;
    p.z = atan2(p.y - o.y, p.x - o.x);
    p.d = (long long)(p.x - o.x) * (p.x - o.x) +
          (long long)(p.y - o.y) * (p.y - o.y);
    set<point>::iterator i = st.lower_bound(p), j;
    if (i == st.end()) i = st.begin();
    j = L(i);
    if (op == 2) {
      if (cross(*j, p, *i) <= 0)
        puts("YES");
      else
        puts("NO");
      continue;
    }
    if (cross(*j, p, *i) <= 0) continue;
    st.insert(p);
    set<point>::iterator cur = st.find(p);
    i = L(cur);
    j = L(i);
    while (cross(*j, *i, *cur) <= 0) {
      st.erase(i);
      i = j;
      j = L(j);
    }
    i = R(cur);
    j = R(i);
    while (cross(*j, *i, *cur) >= 0) {
      st.erase(i);
      i = j;
      j = R(j);
    }
  }
  return 0;
}
