#include <bits/stdc++.h>
using std::complex;
using std::map;
map<int, int> up, down;
inline long long crs(const complex<int> &a, const complex<int> &b) {
  return (long long)a.real() * b.imag() - (long long)a.imag() * b.real();
}
inline bool chk(map<int, int> &convex, complex<int> a) {
  if (!convex.size()) return false;
  if (convex.count(a.real())) return a.imag() >= convex[a.real()];
  if (a.real() < convex.begin()->first || (--convex.end())->first < a.real())
    return false;
  auto it = convex.lower_bound(a.real());
  auto it2 = it;
  it2--;
  complex<int> l(it2->first, it2->second);
  complex<int> r(it->first, it->second);
  return crs(r - l, a - l) >= 0;
}
inline void add(map<int, int> &convex, complex<int> a) {
  if (chk(convex, a)) return;
  convex[a.real()] = a.imag();
  auto r = convex.upper_bound(a.real());
  if (r != convex.end()) {
    auto nxt = r;
    nxt++;
    while (nxt != convex.end()) {
      complex<int> x(r->first, r->second);
      complex<int> y(nxt->first, nxt->second);
      if (crs(x - a, y - a) < 0) {
        convex.erase(r);
        r = nxt;
        nxt++;
      } else
        break;
    }
  }
  auto l = convex.lower_bound(a.real());
  if (l == convex.begin()) return;
  l--;
  if (l != convex.begin()) {
    auto pre = l;
    pre--;
    while (l != convex.begin()) {
      complex<int> x(pre->first, pre->second);
      complex<int> y(l->first, l->second);
      if (crs(x - a, y - a) < 0) {
        convex.erase(l);
        l = pre;
        pre--;
      } else
        break;
    }
  }
}
int main() {
  int q;
  scanf("%d", &q);
  while (q--) {
    int tp, x, y;
    scanf("%d%d%d", &tp, &x, &y);
    if (tp - 1)
      puts(chk(down, complex<int>(x, y)) && chk(up, complex<int>(x, -y))
               ? "YES"
               : "NO");
    else {
      add(down, complex<int>(x, y));
      add(up, complex<int>(x, -y));
    }
  }
  return 0;
}
