#include <bits/stdc++.h>
using namespace std;
const double pi = 3.1415926535897932384626433832795;
struct Pnt {
  Pnt() : x(0), y(0) {}
  Pnt(double x, double y) : x(x), y(y) {}
  Pnt operator+(Pnt const& p) const { return Pnt(x + p.x, y + p.y); }
  Pnt operator-(Pnt const& p) const { return Pnt(x - p.x, y - p.y); }
  Pnt operator*(double a) const { return Pnt(x * a, y * a); }
  double operator*(Pnt p) const { return x * p.x + y * p.y; }
  double operator^(Pnt p) const { return x * p.y - y * p.x; }
  double angle() const { return atan2(y, x); }
  bool operator==(Pnt p) const {
    return make_pair(x, y) == make_pair(p.x, p.y);
  }
  void read() { scanf("%lf%lf", &x, &y); }
  double x, y;
};
struct Sect {
  Sect(Pnt a, Pnt b) : a(a), b(b) {
    assert((a ^ b) >= 0);
    l = a.angle();
  }
  bool operator<(Sect const& s) const { return l + 1e-13 < s.l; }
  Pnt to() const { return b - a; }
  double l;
  Pnt a, b;
};
inline set<Sect>::iterator next(set<Sect>::iterator si, set<Sect>& sects) {
  return (++si == sects.end()) ? sects.begin() : si;
}
inline set<Sect>::iterator prev(set<Sect>::iterator si, set<Sect>& sects) {
  if (si == sects.begin()) si = sects.end();
  return --si;
}
set<Sect>::iterator getSect(Pnt p, set<Sect>& sects) {
  set<Sect>::iterator i = sects.upper_bound(Sect(p, p));
  if (i == sects.begin()) i = sects.end();
  --i;
  assert((i->a ^ p) >= 0);
  assert((p ^ i->b) >= 0);
  return i;
}
int main() {
  long st = clock();
  int q;
  scanf("%d", &q);
  q -= 3;
  assert(q > 0);
  Pnt origin;
  set<Sect> sects;
  {
    Pnt p[3];
    for (int(i) = 0; (i) < (3); ++(i)) {
      scanf("%*d");
      p[i].read();
      origin = origin + p[i];
    }
    for (int(i) = 0; (i) < (3); ++(i)) p[i] = p[i] * 3.0 - origin;
    if ((p[0] ^ p[1]) < 0) swap(p[0], p[1]);
    assert((p[0] ^ p[1]) >= 0);
    assert((p[1] ^ p[2]) >= 0);
    assert((p[2] ^ p[0]) >= 0);
    for (int(i) = 0; (i) < (3); ++(i)) sects.insert(Sect(p[i], p[(i + 1) % 3]));
  }
  for (int(reqIt) = 0; (reqIt) < (q); ++(reqIt)) {
    if (reqIt % 200 == 0 && clock() - st >= 1.8 * CLOCKS_PER_SEC) {
      printf("%d outputted\n", reqIt);
      return 0;
    }
    int req;
    scanf("%d", &req);
    Pnt p;
    p.read();
    p = p * 3.0 - origin;
    if (p == Pnt(0, 0)) {
      if (req == 2) printf("YES\n");
      continue;
    }
    set<Sect>::iterator si = getSect(p, sects);
    if (req == 1) {
      if (((p - si->a) ^ si->to()) <= 0) continue;
      set<Sect>::iterator left = si;
      set<Sect>::iterator prevl = prev(si, sects);
      set<Sect>::iterator right = si;
      set<Sect>::iterator nextr = next(si, sects);
      while (((left->a - p) ^ (prevl->a - p)) >= 0) {
        left = prevl;
        prevl = prev(prevl, sects);
      }
      while (((right->b - p) ^ (nextr->b - p)) <= 0) {
        right = nextr;
        nextr = next(nextr, sects);
      }
      Sect s1(left->a, p);
      Sect s2(p, right->b);
      bool run = true;
      for (set<Sect>::iterator i = left; run;) {
        if (i == right) run = false;
        set<Sect>::iterator toDelete = i;
        i = next(i, sects);
        sects.erase(toDelete);
        if (!run) break;
      }
      sects.insert(s1);
      sects.insert(s2);
    } else {
      printf("%s\n", (((p - si->a) ^ si->to()) > 0) ? "NO" : "YES");
    }
  }
  return 0;
}
