#include <bits/stdc++.h>
using namespace std;
struct pt {
  long long x, y;
  pt() {}
  pt(long long x, long long y) : x(x), y(y) {}
  pt operator-(const pt& other) const { return {x - other.x, y - other.y}; }
  pt operator+(const pt& other) const { return {x + other.x, y + other.y}; }
  bool operator<(const pt& other) const {
    if (x != other.x) {
      return x < other.x;
    }
    return y < other.y;
  }
  bool operator==(const pt& other) const {
    return x == other.x && y == other.y;
  }
};
long long cross(const pt& p, const pt& q) { return p.x * q.y - p.y * q.x; }
long long dot(const pt& p, const pt& q) { return p.x * q.x + p.y * q.y; }
set<pt> lower, upper;
bool below(const pt& p, const pt& a, const pt& b) {
  return cross(p - a, b - a) >= 0;
}
bool above(const pt& p, const pt& a, const pt& b) {
  return cross(p - a, b - a) <= 0;
}
bool below(const pt& p) {
  if (upper.empty()) {
    return false;
  }
  if (p.x < upper.begin()->x ||
      (p.x == upper.begin()->x && p.y > upper.begin()->y)) {
    return false;
  }
  if (p.x > (--upper.end())->x ||
      (p.x == (--upper.end())->x && p.y > (--upper.end())->y)) {
    return false;
  }
  if (!upper.count(p)) {
    set<pt>::iterator it = upper.lower_bound(p);
    if (it == upper.begin()) {
      return true;
    }
    pt r = *it;
    pt l = *(--it);
    if (!below(p, l, r)) {
      return false;
    }
  }
  return true;
}
bool above(const pt& p) {
  if (lower.empty()) {
    return false;
  }
  if (p.x < lower.begin()->x ||
      (p.x == lower.begin()->x && p.y < lower.begin()->y)) {
    return false;
  }
  if (p.x > (--lower.end())->x ||
      (p.x == (--lower.end())->x && p.x < (--lower.end())->y)) {
    return false;
  }
  if (!lower.count(p)) {
    set<pt>::iterator it = lower.lower_bound(p);
    if (it == lower.end()) {
      return true;
    }
    pt r = *it;
    pt l = *(--it);
    if (!above(p, l, r)) {
      return false;
    }
  }
  return true;
}
bool inside(const pt& p) { return above(p) && below(p); }
int main() {
  int q;
  scanf("%d", &q);
  while (q--) {
    int type;
    pt p;
    scanf("%d%lld%lld", &type, &p.x, &p.y);
    bool in = inside(p);
    if (type == 1) {
      if (lower.empty()) {
        lower.insert(p);
        upper.insert(p);
        continue;
      }
      if (in) {
        continue;
      }
      if (!below(p)) {
        set<pt>::iterator it = upper.lower_bound(p);
        if (it != upper.begin()) {
          --it;
          if (it->x == p.x) {
            upper.erase(it);
          }
        }
        it = upper.lower_bound(p);
        if (it != upper.begin()) {
          --it;
          while (true) {
            if (it == upper.begin()) {
              break;
            }
            set<pt>::iterator prev = it;
            --prev;
            if (cross(*it - *prev, p - *it) >= 0) {
              upper.erase(it);
            } else {
              break;
            }
            it = prev;
          }
        }
        it = upper.lower_bound(p);
        if (it != upper.end()) {
          while (true) {
            if (it == --upper.end()) {
              break;
            }
            set<pt>::iterator next = it;
            ++next;
            if (cross(*it - p, *next - *it) >= 0) {
              upper.erase(it);
            } else {
              break;
            }
            it = next;
          }
        }
        upper.insert(p);
      }
      if (!above(p)) {
        set<pt>::iterator it = lower.lower_bound(p);
        if (it != lower.end()) {
          if (p.x == it->x) {
            lower.erase(it);
          }
        }
        it = lower.lower_bound(p);
        if (it != lower.begin()) {
          --it;
          while (true) {
            if (it == lower.begin()) {
              break;
            }
            set<pt>::iterator prev = it;
            --prev;
            if (cross(*it - *prev, p - *it) <= 0) {
              lower.erase(it);
            } else {
              break;
            }
            it = prev;
          }
        }
        it = lower.lower_bound(p);
        if (it != lower.end()) {
          while (true) {
            if (it == --lower.end()) {
              break;
            }
            set<pt>::iterator next = it;
            ++next;
            if (cross(*it - p, *next - *it) <= 0) {
              lower.erase(it);
            } else {
              break;
            }
            it = next;
          }
        }
        lower.insert(p);
      }
    } else {
      if (in) {
        printf("YES\n");
      } else {
        printf("NO\n");
      }
    }
  }
}
