#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct point {
  T x, y;
  point() {}
  point(const T &x, const T &y) : x(x), y(y) {}
  point operator+(const point &b) const { return point(x + b.x, y + b.y); }
  point operator-(const point &b) const { return point(x - b.x, y - b.y); }
  point operator*(const T &b) const { return point(x * b, y * b); }
  point operator/(const T &b) const { return point(x / b, y / b); }
  bool operator==(const point &b) const { return x == b.x && y == b.y; }
  T dot(const point &b) const { return x * b.x + y * b.y; }
  T cross(const point &b) const { return x * b.y - y * b.x; }
};
template <typename T>
struct dynemic_lower_convex_hull {
  map<T, T> hull;
  typename map<T, T>::iterator l, r, l2, r2;
  bool isIn(const point<T> &p) {
    if (hull.empty()) return 0;
    if (hull.count(p.x)) return p.y >= hull[p.x];
    if (p.x < hull.begin()->first || (--hull.end())->first < p.x) return 0;
    l = r = hull.lower_bound(p.x);
    --l;
    point<T> L(l->first, l->second), R(r->first, r->second);
    return (R - L).cross(p - L) >= 0;
  }
  void insert(const point<T> &p) {
    if (isIn(p)) return;
    hull[p.x] = p.y;
    r = hull.upper_bound(p.x);
    if (r != hull.end()) {
      r2 = r;
      ++r2;
      while (r2 != hull.end()) {
        point<T> R(r->first, r->second), R2(r2->first, r2->second);
        if ((R - p).cross(R2 - p) <= 0) {
          hull.erase(r);
          r = r2;
          ++r2;
        } else
          break;
      }
    }
    l = hull.lower_bound(p.x);
    if (l == hull.begin()) return;
    if (--l == hull.begin()) return;
    l2 = l;
    --l2;
    while (l != hull.begin()) {
      point<T> L(l->first, l->second), L2(l2->first, l2->second);
      if ((L2 - p).cross(L - p) <= 0) {
        hull.erase(l);
        l = l2;
        --l2;
      } else
        break;
    }
  }
};
int main() {
  int n;
  scanf("%d", &n);
  dynemic_lower_convex_hull<long long> c1, c2;
  for (int i = 1; i <= n; ++i) {
    int x, y, type;
    scanf("%d%d%d", &type, &x, &y);
    if (type == 1) {
      c1.insert(point<long long>(x, y));
      c2.insert(point<long long>(x, -y));
    } else {
      bool ans1 = c1.isIn(point<long long>(x, y));
      bool ans2 = c2.isIn(point<long long>(x, -y));
      if (ans1 && ans2) {
        puts("YES");
      } else {
        puts("NO");
      }
    }
  }
}
