#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const double eps = 1e-9;
double ox, oy;
struct point {
  double x, y;
  double arg;
  int operator<(const point &p) const { return arg < p.arg; }
  point(double x, double y) : x(x), y(y) { arg = atan2(y - oy, x - ox); }
  point() {}
} p[3];
double cross(const point &a, const point &b, const point &c) {
  double x1 = b.x - a.x, y1 = b.y - a.y, x2 = c.x - a.x, y2 = c.y - a.y;
  return x1 * y2 - x2 * y1;
}
set<point> st;
set<point>::iterator pre(set<point>::iterator t) {
  if (t == st.begin()) return --st.end();
  return --t;
}
set<point>::iterator nxt(set<point>::iterator t) {
  set<point>::iterator ans = ++t;
  if (ans == st.end()) return st.begin();
  return ans;
}
int query(point p) {
  set<point>::iterator nx = st.lower_bound(p);
  if (nx == st.end()) nx = st.begin();
  set<point>::iterator pr = pre(nx);
  return cross(*pr, p, *nx) < eps;
}
void insert(point p) {
  if (query(p)) return;
  set<point>::iterator nx = st.lower_bound(p);
  if (nx == st.end()) nx = st.begin();
  set<point>::iterator pr = pre(nx), prr = pre(pr);
  while (cross(*prr, *pr, p) < eps) st.erase(pr), pr = prr, prr = pre(prr);
  set<point>::iterator nxx = nxt(nx);
  while (cross(p, *nx, *nxx) < eps) st.erase(nx), nx = nxx, nxx = nxt(nxx);
  st.insert(p);
}
int main() {
  ios::sync_with_stdio(false);
  int q;
  cin >> q;
  for (int i = 0; i < 3; i++) {
    int t, x, y;
    cin >> t >> x >> y;
    p[i].x = x;
    p[i].y = y;
  }
  ox = (p[0].x + p[1].x + p[2].x) / 3 + 1e-8;
  oy = (p[0].y + p[1].y + p[2].y) / 3 + 1e-8;
  for (int i = 0; i < 3; i++) {
    st.insert(point(p[i].x, p[i].y));
  }
  while (q-- > 3) {
    int t, x, y;
    cin >> t >> x >> y;
    if (t == 1)
      insert(point(x, y));
    else
      cout << (query(point(x, y)) ? "YES" : "NO") << endl;
  }
  return 0;
}
