#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point() {}
  Point(map<int, int>::iterator p) : x(p->first), y(p->second) {}
  Point(double x, double y) : x(x), y(y) {}
};
Point operator-(Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }
double Cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
int n;
map<int, int> a[2];
map<int, int>::iterator L, R, p;
bool below(map<int, int>& mp, Point P) {
  if (mp.empty()) return false;
  if (mp.find(P.x) != mp.end()) return P.y <= mp[P.x];
  if (P.x < mp.begin()->first || mp.rbegin()->first < P.x) return false;
  L = mp.lower_bound(P.x);
  p = L--;
  return Cross(L - P, p - P) <= 0;
}
void insert(map<int, int>& mp, Point P) {
  if (below(mp, P)) return;
  mp[P.x] = P.y;
  p = mp.lower_bound(P.x);
  R = p;
  ++R;
  if (R != mp.end()) {
    L = R++;
    while (R != mp.end() && Cross(L - P, R - P) >= 0) mp.erase(L), L = R++;
  }
  L = p;
  --L;
  if (L != mp.begin() && p != mp.begin()) {
    R = L--;
    while (R != mp.begin() && Cross(L - P, R - P) >= 0) mp.erase(R), R = L--;
  }
}
int main() {
  scanf("%d", &n);
  int tp, x, y;
  while (n--) {
    scanf("%d %d %d", &tp, &x, &y);
    if (tp == 1)
      insert(a[0], Point(x, y)), insert(a[1], Point(x, -y));
    else if (below(a[0], Point(x, y)) && below(a[1], Point(x, -y)))
      puts("YES");
    else
      puts("NO");
  }
}
