#include <bits/stdc++.h>
using namespace std;
struct nod {
  long long x, y;
  double ang;
  bool operator<(const nod &a) const {
    return ang < a.ang || (ang == a.ang && x < a.x);
  }
} p[7], zx;
long long n;
set<nod> s;
long long read() {
  long long r = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c <= '9' && c >= '0') r = (r << 1) + (r << 3) + c - '0', c = getchar();
  return r * f;
}
nod jian(nod a, nod b) { return (nod){a.x - b.x, a.y - b.y}; }
long long cheng(nod a, nod b) { return a.x * b.y - a.y * b.x; }
long long cha(nod a, nod b, nod c) { return cheng(jian(a, c), jian(b, c)); }
long long chaa(nod a, nod b, nod c) { return cheng(jian(c, a), jian(b, c)); }
set<nod>::iterator pre(set<nod>::iterator x) {
  return x == s.begin() ? --s.end() : --x;
}
set<nod>::iterator nxt(set<nod>::iterator x) {
  return (++x) == s.end() ? s.begin() : x;
}
void insert(nod x) {
  s.insert(x);
  set<nod>::iterator it = s.find(x), i = pre(it), j = pre(i);
  while (cha(*it, *i, *j) >= 0) s.erase(i), i = j, j = pre(j);
  i = nxt(it), j = nxt(i);
  while (cha(*it, *i, *j) <= 0) s.erase(i), i = j, j = nxt(j);
}
signed main() {
  n = read();
  for (long long i = 1; i <= 3; i++) {
    long long opt = read();
    p[i].x = read(), p[i].y = read();
    zx.x += p[i].x, zx.y += p[i].y;
    p[i].x *= 3, p[i].y *= 3;
  }
  for (long long i = 1; i <= 3; i++)
    p[i].ang = atan2(p[i].y - zx.y, p[i].x - zx.x), s.insert(p[i]);
  for (long long i = 4; i <= n; i++) {
    long long opt = read(), x = read() * 3, y = read() * 3;
    nod pi = (nod){x, y, atan2(y - zx.y, x - zx.x)};
    set<nod>::iterator r = s.lower_bound(pi), l;
    if (r == s.end()) r = s.begin();
    l = pre(r);
    if (opt == 1) {
      if (chaa(*l, *r, pi) <= 0) continue;
      insert(pi);
    } else if (chaa(*l, *r, pi) <= 0)
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}
