#include
using namespace std;
inline double sqr(const double& x) { return x * x; }
struct opt { int t, i; double x, y; inline double f(double xo) { return x * xo + y; } inline void read() { scanf("%d%lf%lf", &t, &x, &y); } }; inline bool operator <(const opt& a, const opt& b) { if (a. x == b. x) return a. y < b. y; else return a. x < b. x; }
const int maxn = 500009;
int n, c[maxn]; opt a[maxn];
inline bool inHalf(const opt& a, const opt& b, const opt& c) { double xa(b. x - a. x), ya(b. y - a. y); double xb(c. x - a. x), yb(c. y - a. y); return xa * yb - xb * ya <= 0; }
int mergeSort(int le, int re) { if (le + 1 == re) return a[le]. t == 1 ? re : le; int md((le + re) » 1); int lm(mergeSort(le, md)); int rm(mergeSort(md, re)); static int stc[maxn]; static double k[maxn]; int tst(0); for (int i = lm; i < md; ++ i) { while (tst > 1 && inHalf(a[stc[tst - 1]], a[stc[tst]], a[i])) – tst; stc[++ tst] = i; } for (int i = 1; i < tst; ++ i) k[i] = (a[stc[i + 1]]. y - a[stc[i]]. y) / (a[stc[i + 1]]. x - a[stc[i]]. x); if (tst) { for (int i = md, j = 1; i < rm; ++ i) { for (; j < tst && a[i]. x > k[j]; ++ j); c[a[i]. i] &= (a[i]. f(a[stc[j]]. x) <= a[stc[j]]. y); } } static opt b[maxn]; int tp(le), tc; for (int i = le, j = md; i < lm || j < rm; ++ tp) if (i < lm && (j == rm || a[i] < a[j])) b[tp] = a[i ++]; else b[tp] = a[j ++]; tc = tp; for (int i = lm, j = rm; i < md || j < re; ++ tc) if (i < md && (j == re || a[i] < a[j])) b[tc] = a[i ++]; else b[tc] = a[j ++]; for (int i = le; i < re; ++ i) a[i] = b[i]; return tp; }
int main() { #ifndef ONLINE_JUDGE freopen(".in", “r”, stdin); #endif
scanf("%d", &n);
for (int i = 0; i < n; ++ i) {
a[i]. read();
a[i]. i = i;
c[i] = a[i]. t * 2 - 1;
if (a[i]. t == 1) {
double k(- a[i]. x / a[i]. y);
double b((sqr(a[i]. x) + sqr(a[i]. y)) / (a[i]. y * 2.0));
a[i]. x = k, a[i]. y = b;
}
}
mergeSort(0, n);
for (int i = 0, iz = 0; i < n; ++ i)
if (c[i] > -1)
puts(c[i] && iz ? "Yes" : "No");
else
iz = 1;
}