/*
可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它
看看是否是在合法的那一面

然后cdq分治就可以了

代码基本是抄的,

*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#include<cmath>
#define ll long long
#define M 500050
#define mmp make_pair
using namespace std;
int read() {
    int nm = 0, f = 1;
    char c = getchar();
    for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
    return nm * f;
}
const double inf = pow(2, 80), eps = 1e-10;
int q1[M], q2[M], ans[M], tot, flag, n;
struct Vec {
    double x, y;
};
struct Note {
    Vec x;
    int op, id, qid;
    double k;
    bool operator < (const Note &b) const {
        return this->k < b.k;
    }
} e[M], tmp[M];

double sqr(double x) {
    return x * x;
}

double slope(Vec a, Vec b) {
    if(fabs(a.x - b.x) < eps) return inf;
    return (b.y - a.y) / (b.x - a.x);
}

double dis(Vec a, Vec b) {
    return sqr(a.x - b.x) + sqr(a.y - b.y);
}

double R(Vec a) {
    return sqr(a.x) + sqr(a.y);
}

void cdq(int l, int r) {
    if(l == r) return;
    int mid = (l + r) >> 1, p1 = l, p2 = mid + 1, h1 = 1, h2 = 1, t1 = 0, t2 = 0;
    for(int i = l; i <= r; i++) {
        if(e[i].id <= mid) tmp[p1++] = e[i];
        else tmp[p2++] = e[i];
    }
    memcpy(e + l, tmp + l, sizeof(e[0]) * (r - l + 1));
    cdq(l, mid);
    for(int i = l; i <= mid; i++) {
        if(e[i].op) continue;
        while(h1 < t1 && slope(e[q1[t1]].x, e[i].x) < slope(e[q1[t1 - 1]].x, e[q1[t1]].x)) t1--;
        q1[++t1] = i;
        while(h2 < t2 && slope(e[q2[t2]].x, e[i].x) > slope(e[q2[t2 - 1]].x, e[q2[t2]].x)) t2--;
        q2[++t2] = i;
    }
    for(int i = mid + 1; i <= r; i++) {
        if(!e[i].op) continue;
        if(e[i].x.y > 0) {
            while(h1 < t1 && slope(e[q1[h1]].x, e[q1[h1 + 1]].x) < e[i].k) h1++;
            if(h1 <= t1 && dis(e[q1[h1]].x, e[i].x) > R(e[q1[h1]].x)) ans[e[i].qid] = 0;
        } else {
            while(h2 < t2 && slope(e[q2[t2 - 1]].x, e[q2[t2]].x) < e[i].k) t2--;
            if(h2 <= t2 && dis(e[q2[t2]].x, e[i].x) > R(e[q2[t2]].x)) ans[e[i].qid] = 0;
        }
    }
    cdq(mid + 1, r);
    p1 = l, p2 = mid + 1;
    for(int i = l; i <= r; i++) {
        if(p2 > r || p1 <= mid && e[p1].x.x < e[p2].x.x) tmp[i] = e[p1++];
        else tmp[i] = e[p2++];
    }
    memcpy(e + l, tmp + l, sizeof(e[0]) * (r - l + 1));
}
int main() {
    n = read();
    for(int i = 1; i <= n; i++) {
        e[i].op = read();
        scanf("%lf%lf", &e[i].x.x, &e[i].x.y);
        e[i].id = i;
        if(e[i].op) {
            e[i].qid = ++tot;
            if(flag) ans[tot] = 1;
            if(e[i].x.y) e[i].k = -e[i].x.x / e[i].x.y;
            else e[i].k = inf;
        } else flag = 1;
    }
    sort(e + 1, e + n + 1);
    cdq(1, n);
    for(int i = 1; i <= tot; i++) puts(ans[i] ? "Yes" : "No");
    return 0;
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄