#include <bits/stdc++.h>
using namespace std;
int n, opr, x, y;
struct point {
  long long x, y;
  double ang;
} o, ori[5];
set<point> S;
set<point>::iterator pre, it, suc;
inline bool operator<(point i, point j) {
  return i.ang == j.ang ? i.x < j.x : i.ang < j.ang;
}
point operator-(point i, point j) { return (point){i.x - j.x, i.y - j.y}; }
long long cross(point i, point j) { return i.x * j.y - i.y * j.x; }
set<point>::iterator PRE(set<point>::iterator x) {
  return x == S.begin() ? --S.end() : --x;
}
set<point>::iterator SUC(set<point>::iterator x) {
  return (++x) == S.end() ? S.begin() : x;
}
inline void insert(point p) {
  if (cross(p - *pre, *suc - p) <= 0) return;
  S.insert(p);
  set<point>::iterator cur, i, j;
  cur = S.find(p);
  i = PRE(cur);
  j = PRE(i);
  while (cross(*j - *cur, *i - *j) <= 0) {
    S.erase(i);
    i = j;
    j = PRE(j);
  }
  i = SUC(cur);
  j = SUC(i);
  while (cross(*j - *cur, *i - *j) >= 0) {
    S.erase(i);
    i = j;
    j = SUC(j);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < 3; i++) {
    scanf("%d %lld %lld", &opr, &ori[i].x, &ori[i].y);
    o.x += ori[i].x;
    o.y += ori[i].y;
    ori[i].x *= 3;
    ori[i].y *= 3;
  }
  for (int i = 0; i < 3; i++) {
    ori[i].ang = atan2(ori[i].y - o.y, ori[i].x - o.x);
    S.insert(ori[i]);
  }
  n -= 3;
  while (n--) {
    scanf("%d %d %d", &opr, &x, &y);
    x *= 3, y *= 3;
    point p = (point){x, y, atan2(y - o.y, x - o.x)};
    if ((suc = S.lower_bound(p)) == S.end()) suc = S.begin();
    pre = PRE(suc);
    if (opr == 1)
      insert(p);
    else if (cross(p - *pre, *suc - p) <= 0)
      printf("YES\n");
    else
      printf("NO\n");
  }
}
