#include <bits/stdc++.h>
using namespace std;
class PT {
 public:
  long long x, y;
  PT() {}
  PT(long long _x, long long _y) {
    x = _x;
    y = _y;
  }
  PT operator+(const PT& p) const { return PT(x + p.x, y + p.y); }
  PT operator-(const PT& p) const { return PT(x - p.x, y - p.y); }
  long long operator*(const PT& p) const { return x * p.x + y * p.y; }
  long long operator^(const PT& p) const { return x * p.y - y * p.x; }
};
inline long long tri(PT p1, PT p2, PT p3) { return (p2 - p1) ^ (p3 - p1); }
class ND {
 public:
  ND* nx[16 + 1];
  ND* pr[16 + 1];
  PT p;
  int h;
  ND() {}
  ND(const PT& _p, int _h = 0) {
    int x, i;
    if (_h) {
      h = _h;
    } else {
      x = rand() & ((1 << 16) - 1);
      for (h = 0; x & (1 << h); h++)
        ;
    }
    p = _p;
    for (i = 0; i <= h; i++) {
      nx[i] = pr[i] = this;
    }
  }
  void insert(ND* d, int s = 0) {
    int i;
    for (i = s; i <= h && i <= d->h; i++) {
      d->nx[i] = nx[i];
      d->pr[i] = this;
      nx[i]->pr[i] = d;
      nx[i] = d;
    }
    if (i <= d->h) pr[h]->insert(d, h + 1);
  }
  ND* del() {
    int i;
    ND* t;
    t = nx[0];
    for (i = 0; i <= h; i++) {
      nx[i]->pr[i] = pr[i];
      pr[i]->nx[i] = nx[i];
    }
    delete this;
    return t;
  }
  void prt() {
    ND* t;
    t = this;
    do {
      printf("%lld %lld  %d\n", t->p.x, t->p.y, t->h);
      t = t->nx[0];
    } while (t != nx[h]);
  }
  void check() {
    PT p, q, r;
    ND* t;
    t = this;
    p = t->p;
    t = t->nx[0];
    q = t->p;
    do {
      t = t->nx[0];
      r = t->p;
      if (tri(p, q, r) <= 0) {
        while (1)
          ;
      }
      p = q;
      q = r;
    } while (t != this);
  }
};
ND* head;
inline int inside(PT p) {
  ND *L, *R, *M;
  int h;
  L = head;
  R = head->pr[0];
  if (tri(R->p, L->p, p) < 0) return 0;
  h = L->h;
  while (L->nx[h] == L) h--;
  while (1) {
    while (h >= 0 && (M = L->nx[h]) == R) h--;
    if (h < 0) break;
    if (tri(L->p, M->p, p) < 0) {
      R = M;
    } else if (tri(M->p, R->p, p) < 0) {
      L = M;
    } else {
      return 1;
    }
  }
  return 0;
}
inline void insert(PT p) {
  ND *L, *R, *M;
  int h;
  L = head;
  R = head->pr[0];
  if (tri(R->p, L->p, p) <= 0) {
    if (tri(R->p, L->p, p) == 0 && (R->p - p) * (L->p - p) <= 0) return;
    swap(L, R);
    while (tri(L->pr[0]->p, L->p, p) <= 0) L = L->del()->pr[0];
    if (tri(R->p, R->nx[0]->p, p) <= 0) {
      R = R->nx[0];
      while (tri(R->p, R->nx[0]->p, p) <= 0) R = R->del();
      head->p = p;
    } else {
      L->insert(new ND(p));
    }
  } else {
    h = L->h;
    while (L->nx[h] == L) h--;
    while (1) {
      while (h >= 0 && (M = L->nx[h]) == R) h--;
      if (h < 0) break;
      if (tri(L->p, M->p, p) < 0) {
        R = M;
      } else if (tri(M->p, R->p, p) < 0) {
        L = M;
      } else {
        return;
      }
    }
    while (tri(L->pr[0]->p, L->p, p) <= 0) L = L->del()->pr[0];
    while (tri(R->p, R->nx[0]->p, p) <= 0) R = R->del();
    L->insert(new ND(p));
  }
}
int main() {
  srand(88213);
  int QQ, qq, tp, tx, ty;
  PT p, p1, p2, p3, C;
  scanf("%d", &QQ);
  scanf("%d %d %d", &tp, &tx, &ty);
  p1 = PT(tx, ty);
  scanf("%d %d %d", &tp, &tx, &ty);
  p2 = PT(tx, ty);
  scanf("%d %d %d", &tp, &tx, &ty);
  p3 = PT(tx, ty);
  if (tri(p1, p2, p3) < 0) {
    swap(p2, p3);
  }
  head = new ND(p1, 16);
  head->insert(new ND(p3));
  head->insert(new ND(p2));
  for (qq = 3; qq < QQ; qq++) {
    scanf("%d %d %d", &tp, &tx, &ty);
    p = PT(tx, ty);
    if (tp == 1) {
      insert(p);
    } else {
      puts(inside(p) ? "YES" : "NO");
    }
  }
  return 0;
}
