#include <bits/stdc++.h>
using namespace std;
struct hull {
  map<int, int> points;
  long long area;
  inline hull() {
    points.clear();
    area = 0;
  }
  inline map<int, int>::iterator prev(map<int, int>::iterator it) {
    return it == points.begin() ? it : --it;
  }
  inline map<int, int>::iterator next(map<int, int>::iterator it) {
    return it == points.end() ? it : ++it;
  }
  inline long long traparea(long long x1, long long y1, long long x2,
                            long long y2) {
    return (x2 - x1) * (y1 + y2);
  }
  inline long long triarea(long long x1, long long y1, long long x2,
                           long long y2, long long x3, long long y3) {
    return traparea(x1, y1, x2, y2) + traparea(x2, y2, x3, y3) +
           traparea(x3, y3, x1, y1);
  }
  inline long long traparea(map<int, int>::iterator a,
                            map<int, int>::iterator b) {
    return traparea(a->first, a->second, b->first, b->second);
  }
  inline long long triarea(map<int, int>::iterator it) {
    long long sum = 0;
    if (it != points.begin()) sum += traparea(prev(it), it);
    if (next(it) != points.end()) sum += traparea(it, next(it));
    if (it != points.begin() && next(it) != points.end())
      sum += traparea(next(it), prev(it));
    return sum;
  }
  inline bool bad(map<int, int>::iterator it) {
    if (points.size() < 3 || it == points.begin() || next(it) == points.end())
      return false;
    return triarea(it) <= 0;
  }
  inline bool insert(int x, int y, bool modify = true) {
    if (points.find(x) != points.end()) {
      if (y <= points[x]) return false;
      if (modify) {
        area -= triarea(points.lower_bound(x));
        points.erase(x);
      }
    }
    map<int, int>::iterator old = points.find(x);
    map<int, int>::iterator it = points.insert(make_pair(x, y)).first;
    if (bad(it)) {
      points.erase(it);
      return false;
    }
    if (!modify) {
      points.erase(it);
      if (old != points.end()) points.insert(*old);
      return true;
    }
    area += triarea(it);
    while (bad(prev(it))) {
      area -= triarea(prev(it));
      points.erase(prev(it));
    }
    while (bad(next(it))) {
      area -= triarea(next(it));
      points.erase(next(it));
    }
    return true;
  }
  inline bool contains(int x, int y) {
    return !insert(x, y, false);
    map<int, int>::iterator first = points.begin(), last = prev(points.end());
    if (x < first->first || x > last->first) return false;
    if (x == first->first) return y <= first->second;
    if (x == last->first) return y <= last->second;
    map<int, int>::iterator it = points.lower_bound(x), p = prev(it);
    int x1 = p->first, y1 = p->second, x2 = it->first, y2 = it->second;
    return (long long)(y - y1) * (x2 - x1) <= (long long)(x - x1) * (y2 - y1);
  }
};
int Q;
hull upper, lower;
int main() {
  scanf("%d", &Q);
  while (Q-- > 0) {
    int type, x, y;
    scanf("%d %d %d", &type, &x, &y);
    if (type == 1) {
      upper.insert(x, y);
      lower.insert(x, -y);
    } else if (type == 2)
      puts((upper.contains(x, y) && lower.contains(x, -y)) ? "YES" : "NO");
  }
  return 0;
}
