#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  Point() {}
  Point(int xx, int yy) : x(xx), y(yy) {}
};
inline bool operator<(const Point &p1, const Point &p2) {
  return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);
}
inline int sgn(long long x) {
  if (x == 0) return x;
  return x < 0 ? -1 : 1;
}
inline int cross(Point p1, Point p2, Point p) {
  p1.x -= p.x;
  p1.y -= p.y;
  p2.x -= p.x;
  p2.y -= p.y;
  return sgn((long long)p1.x * p2.y - (long long)p2.x * p1.y);
}
struct Hull {
  set<Point> pset;
  int sign;
  void clear() { pset.clear(); }
  bool inside(Point p) {
    set<Point>::iterator it = pset.lower_bound(p);
    if (it == pset.end()) return 0;
    if (it == pset.begin() && p < *it) return 0;
    set<Point>::iterator cit = it--;
    if (it->x < cit->x) return cross(p, *it, *cit) >= 0;
    return 1;
  }
  void add(Point p) {
    if (inside(p)) return;
    set<Point>::iterator fixit, it, cit;
    it = pset.lower_bound(p);
    if (it != pset.begin() && --it != pset.begin())
      for (cit = it--; cit != pset.begin(); cit = it--) {
        if (cross(*cit, *it, p) <= 0) break;
        pset.erase(cit);
      }
    it = pset.lower_bound(p);
    if (it != pset.end())
      for (cit = it++; it != pset.end(); cit = it++) {
        if (cross(*cit, *it, p) >= 0) break;
        pset.erase(cit);
      }
    pset.insert(p);
  }
} uphull, downhull;
int q;
void solve() {
  uphull.clear();
  downhull.clear();
  for (int x, y, ty, i = 0; i < q; ++i) {
    scanf("%d%d%d", &ty, &x, &y);
    if (ty == 1) {
      downhull.add(Point(x, y));
      uphull.add(Point(x, -y));
    } else {
      if (uphull.inside(Point(x, -y)) && downhull.inside(Point(x, y)))
        puts("YES");
      else
        puts("NO");
    }
    if (x == 1 && y == 6) {
    }
  }
}
int main() {
  scanf("%d", &q);
  solve();
  return 0;
}
