#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int w = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) w |= c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  return w ? -x : x;
}
namespace star {
const int maxn = 2e5 + 10;
int n;
struct vec {
  int x, y;
  vec(int _x = 0, int _y = 0) : x(_x), y(_y) {}
  vec(pair<int, int> a) : x(a.first), y(a.second) {}
  vec operator+(const vec &a) const { return vec(x + a.x, y + a.y); }
  vec operator-(const vec &a) const { return vec(x - a.x, y - a.y); }
} e[maxn];
inline long long cp(vec a, vec b) { return 1ll * a.x * b.y - 1ll * a.y * b.x; }
map<int, int> convex[2];
map<int, int>::iterator l, r, l2, r2;
inline bool query(map<int, int> &q, int x, int y) {
  if (q.empty() or x < q.begin()->first or q.rbegin()->first < x) return false;
  if (q.find(x) != q.end()) return y >= q[x];
  l = r = q.lower_bound(x), --l;
  return cp(vec(*r) - vec(*l), vec(x, y) - vec(*l)) >= 0;
}
inline void insert(map<int, int> &q, int x, int y) {
  if (query(q, x, y)) return;
  q[x] = y;
  r = q.upper_bound(x);
  if (r != q.end()) {
    r2 = r, ++r2;
    while (r2 != q.end())
      if (cp(vec(*r2) - vec(x, y), vec(*r) - vec(x, y)) >= 0)
        q.erase(r), r = r2, ++r2;
      else
        break;
  }
  l = q.lower_bound(x);
  if (l == q.begin()) return;
  --l;
  if (l == q.begin()) return;
  l2 = l, --l2;
  while (l != q.begin())
    if (cp(vec(x, y) - vec(*l2), vec(*l) - vec(*l2)) >= 0)
      q.erase(l), l = l2, l2--;
    else
      break;
}
inline void work() {
  n = read();
  for (int x, y, i = 1; i <= n; i++)
    if (read() == 1)
      x = read(), y = read(), insert(convex[0], x, y), insert(convex[1], x, -y);
    else
      x = read(), y = read(),
      puts(query(convex[0], x, y) & query(convex[1], x, -y) ? "YES" : "NO");
}
}  // namespace star
signed main() {
  star::work();
  return 0;
}
