#include <bits/stdc++.h>
#define ar array
//#define int long long
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int mod = 1e9 + 7;
const ll inf = 1e18;
const int maxn = 1e5 + 5;
struct union_find {
    int n;
    vector<int> par, size;
    union_find(int _n) : n(_n), par(n+1), size(n+1) {
        for(int i=1; i<=n; i++) par[i] = i;
    }
    int find(int u) {
        if(u == par[u]) return u;
        return par[u] = find(par[u]);
    }
    void uni(int a, int b) {
        a = find(a); b = find(b);
        if(a == b) return ;
        if(size[a] < size[b]) swap(a, b);
        size[a] += size[b];
        par[b] = a;
    }
    bool same_set(int a, int b) {
        return find(a) == find(b);
    }
};
double dist(ll x1, ll y1, ll x2, ll y2) {
    ll a = (x2 - x1) * (x2 - x1);
    ll b = (y2 - y1) * (y2 - y1);
    return sqrt(a + b);
}
vector<pii> bad[5][5];
signed main() {
    ios_base::sync_with_stdio(false);
    cout.tie(0); cin.tie(0);
    int n, q; cin >> n >> q;
    ll w, h; cin >> w >> h;
    bad[1][2] = bad[2][1] = {{n+3, n+4}, {n+1, n+3}, {n+2, n+3}};
    bad[1][3] = bad[3][1] = {{n+1, n+2}, {n+3, n+4}, {n+1, n+3}, {n+2, n+4}};
    bad[1][4] = bad[4][1] = {{n+1, n+2}, {n+1, n+3}, {n+1, n+4}};
    bad[2][3] = bad[3][2] = {{n+1, n+2}, {n+2, n+3}, {n+2, n+4}};
    bad[2][4] = bad[4][2] = {{n+1, n+2}, {n+3, n+4}, {n+2, n+3}, {n+1, n+4}};
    bad[3][4] = bad[4][3] = {{n+3, n+4}, {n+2, n+4}, {n+1, n+4}};
    vector<ar<ll, 3> > a(n+1);
    for(int i=1; i<=n; i++) cin >> a[i][0] >> a[i][1] >> a[i][2];
    vector<pair<double, pii> > E;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            double d = dist(a[i][0], a[i][1], a[j][0], a[j][1]);
            E.push_back({ d - a[i][2] - a[j][2], { i, j } });
        }
        E.push_back({ (double)a[i][0] - a[i][2], { i, n + 1 } });
        E.push_back({ (double)w - a[i][0] - a[i][2], { i, n + 2 } });
        E.push_back({ (double)a[i][1] - a[i][2], { i, n + 3 } });
        E.push_back({ (double)h - a[i][1] - a[i][2], { i, n + 4 } });
    }
    vector<ar<ll, 3> > qus(q+1);
    for(int i=1; i<=q; i++) {
        cin >> qus[i][0] >> qus[i][1];
        qus[i][2] = i;
    }
    sort(E.begin(), E.end());
    sort(qus.begin()+1, qus.end());
    vector<ar<int, 5> > ans(q+1);
    union_find dsu(n+4);
    int j = 0;
    for(int i=1; i<=q; i++) {
        auto [r, in, id] = qus[i];
        ans[id][in] = 1;
        while(j < E.size() && E[j].first < 2*r) {
            dsu.uni(E[j].second.first, E[j].second.second);
            j++;
        }
        for(int j=1; j<=4; j++) {
            bool ok = 1;
            for(auto [x, y] : bad[in][j])
                if(dsu.same_set(x, y)) ok = 0;
            ans[id][j] = ok;
        }
    }
    for(int i=1; i<=q; i++) {
        for(int j=1; j<=4; j++) if(ans[i][j]) cout << j;
        cout << '\n';
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |