#include <bits/stdc++.h>
using namespace std;
struct lessK {
  bool operator()(const double &k1, const double &k2) const { return k1 < k2; }
};
map<double, double, lessK> Convex[2];
map<double, double, lessK>::iterator p, it, it1, it2, q;
double cross(pair<double, double> a, pair<double, double> b,
             pair<double, double> c) {
  return (b.first - a.first) * (c.second - a.second) -
         (b.second - a.second) * (c.first - a.first);
}
bool judge(map<double, double, lessK> &st, int x, int y) {
  if (!st.size()) return false;
  if (st.find(x) != st.end()) return y >= st[x];
  if (x < st.begin()->first || (--st.end())->first < x) return false;
  p = st.lower_bound(x);
  q = p;
  q--;
  return cross(make_pair(x, y), *q, *p) >= 0;
}
void insert(map<double, double, lessK> &st, int x, int y) {
  if (judge(st, x, y)) return;
  st[x] = y;
  p = st.upper_bound(x);
  it = p;
  it--;
  it1 = it;
  it1--;
  it2 = it1;
  it2--;
  if (p != st.end()) {
    q = p;
    q++;
    while (q != st.end() && cross(make_pair(x, y), *q, *p) >= 0) {
      st.erase(p);
      p = q;
      q++;
    }
  }
  if (it == st.begin() || it1 == st.begin()) return;
  while (it1 != st.begin() && cross(make_pair(x, y), *it1, *it2) >= 0) {
    st.erase(it1);
    it1 = it2;
    it2--;
  }
}
int main() {
  int Q, op;
  double x, y;
  scanf("%d", &Q);
  while (Q--) {
    scanf("%d%lf%lf", &op, &x, &y);
    if (op == 1) {
      insert(Convex[0], x, y);
      insert(Convex[1], x, -y);
    } else {
      bool ans1 = judge(Convex[0], x, y);
      bool ans2 = judge(Convex[1], x, -y);
      if (ans1 && ans2)
        puts("YES");
      else
        puts("NO");
    }
  }
  return 0;
}
