#include <bits/stdc++.h>
int n;
struct pt {
  int x, y;
  pt(){};
  pt(int X, int Y) : x(X), y(Y){};
  bool operator<(pt b) const { return x == b.x ? y < b.y : x < b.x; }
};
long long Cross(pt y, pt z, pt x) {
  return 1ll * (y.x - x.x) * (z.y - x.y) - 1ll * (z.x - x.x) * (y.y - x.y);
}
struct Hull {
  std::set<pt> H;
  void Ins(pt p) {
    if (H.size() >= 2) {
      std::set<pt>::iterator pre = H.lower_bound(p), suf = H.upper_bound(p),
                             tmp;
      if (pre != H.begin() && suf != H.end()) {
        --pre;
        if (Cross(*pre, *suf, p) >= 0) return;
        while (pre != H.begin() && (tmp = pre, --tmp, 1) &&
               Cross(*pre, p, *tmp) <= 0)
          H.erase(pre), pre = tmp;
        while ((tmp = suf, ++tmp, 1) && (tmp != H.end()) &&
               Cross(*suf, *tmp, p) <= 0)
          H.erase(suf), suf = tmp;
      } else if (pre != H.begin()) {
        --pre;
        while (pre != H.begin() && (tmp = pre, --tmp, 1) &&
               Cross(*pre, p, *tmp) <= 0)
          H.erase(pre), pre = tmp;
      } else {
        while ((tmp = suf, ++tmp, 1) && (tmp != H.end()) &&
               Cross(*suf, *tmp, p) <= 0)
          H.erase(suf), suf = tmp;
      }
    }
    H.insert(p);
  }
  bool inHull(pt p) {
    if (H.find(p) != H.end()) return 1;
    std::set<pt>::iterator pre = H.lower_bound(p), suf = H.upper_bound(p);
    if (pre == H.begin() || suf == H.end()) return 0;
    --pre;
    return Cross(*pre, *suf, p) >= 0;
  }
} U, D;
int main() {
  scanf("%d", &n);
  while (n--) {
    int ty, x, y;
    scanf("%d %d %d", &ty, &x, &y);
    if (ty == 1)
      D.Ins(pt(x, y)), x *= -1, y *= -1, U.Ins(pt(x, y));
    else
      puts(D.inHull(pt(x, y)) && (x *= -1, y *= -1, U.inHull(pt(x, y))) ? "YES"
                                                                        : "NO");
  }
  return 0;
}
