#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T& x) {
  x = 0;
  char c = getchar();
  bool sgn = 0;
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') sgn = 1, c = getchar();
  while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
  if (sgn) x = -x;
}
struct point {
  long long x, y;
  point() {}
  point(long long _x, long long _y) : x(_x), y(_y) {}
  point(const pair<long long, long long>& p) : x(p.first), y(p.second) {}
  bool operator<(const point& p) const { return x == p.x ? y < p.y : x < p.x; }
  bool operator==(const point& p) const { return x == p.x && y == p.y; }
  bool operator>(const point& p) const { return x == p.x ? y > p.y : x > p.x; }
  point operator+(const point& p) const { return point(x + p.x, y + p.y); }
  point operator-(const point& p) const { return point(x - p.x, y - p.y); }
  point operator*(long long k) const { return point(x * k, y * k); }
};
long long cross(const point& u, const point& v) {
  return u.x * v.y - v.x * u.y;
}
map<long long, long long>::iterator i, j, k, l, o;
map<long long, long long> up, down;
bool check(map<long long, long long>& mp, const point& p) {
  if (mp.empty()) return 1;
  if (mp.count(p.x)) return p.y > mp[p.x];
  if (p.x < mp.begin()->first || p.x > (--mp.end())->first) return 1;
  i = mp.lower_bound(p.x);
  j = i, j--;
  return cross(point(*i) - point(*j), p - point(*j)) > 0;
}
void insert(map<long long, long long>& mp, const point& p) {
  if (!check(mp, p)) return;
  mp[p.x] = p.y;
  k = mp.upper_bound(p.x);
  l = k, l--;
  if (k != mp.end())
    for (j = i = k, j++;
         j != mp.end() && cross(point(*j) - point(*i), p - point(*i)) > 0;
         i = j, j++)
      mp.erase(i);
  if (l != mp.begin()) {
    l--;
    if (l != mp.begin()) {
      for (o = l, o--;
           l != mp.begin() && cross(point(*o) - point(*l), p - point(*l)) < 0;
           l = o, o--) {
        mp.erase(l);
      }
    }
  }
}
signed main() {
  int Q;
  read(Q);
  while (Q--) {
    int mo;
    point p;
    read(mo), read(p.x), read(p.y);
    if (mo == 1) {
      insert(up, p);
      insert(down, point(p.x, -p.y));
    } else {
      puts(check(up, p) || check(down, point(p.x, -p.y)) ? "NO" : "YES");
    }
  }
}
