#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
};
Point operator-(const Point &A, const Point &B) {
  return Point(A.x - B.x, A.y - B.y);
}
long long Cross(const Point &A, const Point &B) {
  return 1ll * A.x * B.y - 1ll * A.y * B.x;
}
set<Point> ts, tx;
bool operator<(const Point &A, const Point &B) {
  return A.x < B.x || (A.x == B.x && A.y < B.y);
}
Point p;
int n, o;
set<Point>::iterator a, b;
bool Query(set<Point> &P, Point p) {
  if (P.empty()) return 0;
  a = b = P.lower_bound(p);
  if (b == P.end()) return 0;
  if (b->x == p.x && b->y == p.y) return 1;
  if (a != P.begin())
    --a;
  else
    return 0;
  return Cross(*b - *a, p - *a) >= 0;
}
void Add(set<Point> &P, Point p) {
  if (Query(P, p)) return;
  a = P.lower_bound(p);
  if (a != P.end()) {
    for (b = a, ++b; b != P.end() && Cross(*a - p, *b - p) < 0; a = b, ++b)
      P.erase(a);
  }
  b = P.lower_bound(p);
  if (b != P.begin() && (--b, b != P.begin())) {
    for (a = b, --a; a != P.end() && Cross(*a - p, *b - p) < 0; b = a, --a)
      P.erase(b);
  }
  P.insert(p);
}
int main() {
  scanf("%d", &n);
  while (n--) {
    scanf("%d", &o);
    scanf("%d%d", &p.x, &p.y);
    if (o == 1)
      Add(tx, p), p.y = -p.y, Add(ts, p);
    else
      puts(Query(tx, p) && (p.y = -p.y, Query(ts, p)) ? "YES" : "NO");
  }
  return 0;
}
