#include <bits/stdc++.h>
using namespace std;
int sgn(double x) { return fabs(x) < 1e-7 ? 0 : (x > 0 ? 1 : -1); }
struct Line {
  static bool Q;
  mutable double k, b, p;
  bool operator<(const Line& o) const { return Q ? p < o.p : k < o.k; }
};
bool Line::Q = false;
struct LineContainer : multiset<Line> {
  const double INF = numeric_limits<double>::max();
  double div(double a, double b) { return a / b; }
  bool over(iterator x, iterator y) {
    if (y == end()) {
      x->p = INF;
      return false;
    }
    if (x->k == y->k)
      x->p = x->b > y->b ? INF : -INF;
    else
      x->p = div(y->b - x->b, x->k - y->k);
    return x->p >= y->p;
  }
  void add(double k, double b) {
    auto z = insert({k, b, 0}), y = z++, x = y;
    while (over(y, z)) z = erase(z);
    if (x != begin() && over(--x, y)) over(x, y = erase(y));
    while ((y = x) != begin() && (--x)->p >= y->p) over(x, erase(y));
    if (!empty() && begin()->p == -INF) erase(begin());
  }
  double query(double x) {
    assert(!empty());
    Line::Q = 1;
    auto l = lower_bound({0, 0, x});
    Line::Q = 0;
    return l->k * x + l->b;
  }
  bool above(double k, double b) {
    assert(!empty());
    auto p = lower_bound({k - 1e-7, -INF, 0});
    if (p == end()) {
      --p;
      return sgn(p->k - k) == 0 && sgn(-p->b + b) <= 0;
    }
    if (sgn(p->k - k) == 0) return sgn(-p->b + b) <= 0;
    if (p == begin()) return false;
    --p;
    return sgn(-b - (-p->b + p->p * (k - p->k))) >= 0;
  }
};
int main() {
  LineContainer up, low;
  int q;
  scanf("%d", &q);
  while (q--) {
    int t, x, y;
    scanf("%d%d%d", &t, &x, &y);
    if (t == 1) {
      up.add(x, y);
      low.add(x, -y);
    } else if (t == 2) {
      puts(up.above(x, y) && low.above(x, -y) ? "YES" : "NO");
    }
  }
  return 0;
}
