#include <bits/stdc++.h>
std::map<int, int> top, down;
inline long long Cro(int x1, int y1, int x2, int y2) {
  return (long long)x1 * y2 - (long long)x2 * y1;
}
inline bool PIP_top(int x, int y) {
  std::map<int, int>::iterator it = top.lower_bound(x);
  if (it == top.end()) return 0;
  if (it->first == x) return (y - it->second) <= 0;
  if (it == top.begin()) return 0;
  std::map<int, int>::iterator jt = it;
  --jt;
  return Cro(x - jt->first, y - jt->second, it->first - jt->first,
             it->second - jt->second) >= 0;
}
inline bool erase_top(std::map<int, int>::iterator it) {
  if (it == top.begin()) return 0;
  std::map<int, int>::iterator jt = it, kt = it;
  --jt;
  ++kt;
  if (kt == top.end()) return 0;
  if (Cro(it->first - jt->first, it->second - jt->second, kt->first - jt->first,
          kt->second - jt->second) >= 0)
    return 1;
  return 0;
}
inline void insert_top(int x, int y) {
  if (PIP_top(x, y)) return;
  top[x] = y;
  std::map<int, int>::iterator it = top.find(x), jt = it;
  if (it != top.begin()) {
    --jt;
    while (erase_top(jt)) {
      std::map<int, int>::iterator tmp = jt--;
      top.erase(tmp);
    }
  }
  if ((jt = ++it) != top.end())
    while (erase_top(jt)) {
      std::map<int, int>::iterator tmp = jt++;
      top.erase(tmp);
    }
}
inline bool PIP_down(int x, int y) {
  std::map<int, int>::iterator it = down.lower_bound(x);
  if (it == down.end()) return 0;
  if (it->first == x) return (y - it->second) * (-1) <= 0;
  if (it == down.begin()) return 0;
  std::map<int, int>::iterator jt = it;
  --jt;
  return Cro(x - jt->first, y - jt->second, it->first - jt->first,
             it->second - jt->second) *
             (-1) >=
         0;
}
inline bool erase_down(std::map<int, int>::iterator it) {
  if (it == down.begin()) return 0;
  std::map<int, int>::iterator jt = it, kt = it;
  --jt, ++kt;
  if (kt == down.end()) return 0;
  if (Cro(it->first - jt->first, it->second - jt->second, kt->first - jt->first,
          kt->second - jt->second) *
          (-1) >=
      0)
    return 1;
  return 0;
}
inline void insert_down(int x, int y) {
  if (PIP_down(x, y)) return;
  down[x] = y;
  std::map<int, int>::iterator it = down.find(x), jt = it;
  if (it != down.begin()) {
    --jt;
    while (erase_down(jt)) {
      std::map<int, int>::iterator tmp = jt--;
      down.erase(tmp);
    }
  }
  if ((jt = ++it) != down.end())
    while (erase_down(jt)) {
      std::map<int, int>::iterator tmp = jt++;
      down.erase(tmp);
    }
}
int main() {
  int q, op, x, y;
  scanf("%d", &q);
  while (q--) {
    scanf("%d%d%d", &op, &x, &y);
    if (op == 1)
      insert_top(x, y), insert_down(x, y);
    else
      puts((PIP_top(x, y) && PIP_down(x, y)) ? "YES" : "NO");
  }
}
