#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
struct DSU{
int n;
vector<int>par,siz;
void init(int N){
n=N;
siz.resize(n+1,0);
par.resize(n+1);iota(par.begin(),par.end(),0);
}
int get(int x){
if(x==par[x])return x;
return par[x]=get(par[x]);
}
bool unite(int a,int b){
a=get(a);b=get(b);
if(a==b)return false;
if(siz[a]<siz[b])swap(a,b);
par[b]=a;
siz[a]+=siz[b];
return true;
}
};
int n,m,w,h;
array<ll,3>arr[2023];
vector<pair<ll,pair<int,int>>>ed;
vector<pair<ll,vector<int>>>v;
DSU dsu;
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);
cin>>n>>m>>w>>h;
n+=4;
for(int i=5;i<=n;i++){
for(int j=0;j<3;j++){
cin>>arr[i][j];
}
ed.pb({arr[i][1]-arr[i][2],{1,i}});
ed.pb({h-arr[i][1]-arr[i][2],{3,i}});
ed.pb({arr[i][0]-arr[i][2],{4,i}});
ed.pb({w-arr[i][0]-arr[i][2],{2,i}});
for(int j=5;j<i;j++){
ed.pb({ll(sqrt(((arr[i][0]-arr[j][0])*(arr[i][0]-arr[j][0]))+((arr[i][1]-arr[j][1])*(arr[i][1]-arr[j][1]))))-arr[i][2]-arr[j][2],{i,j}});
}
}
sort(ed.begin(),ed.end());
dsu.init(n);
v.pb({0,{1,2,3,4}});
for(auto x:ed){
dsu.unite(x.sc.fr,x.sc.sc);
if(v.size()==0||v.back().fr!=x.fr){
v.pb({x.fr,vector<int>(4)});
}
for(int i=1;i<=4;i++){
v.back().sc[i-1]=dsu.get(i);
}
}
for(int i=1;i<=m;i++){
int R,g;cin>>R>>g;
int l=0,r=int(v.size())-1;
while(l<r){
int mi=(l+r+1)/2;
if(v[mi].fr<R*2)l=mi;
else r=mi-1;
}
vector<int>z=v[l].sc;
for(int i=0;i<4;i++){
z.pb(z[i]);
}
set<int>st;
g--;
st.insert(g+1);
if(z[g+0]!=z[g+1]&&z[g+0]!=z[g+2]&&z[g+0]!=z[g+3]){
st.insert(((g+1)%4)+1);
}
if(z[g+1]!=z[g+3]&&z[g+1]!=z[g+2]&&z[g+3]!=z[g+0]&&z[g+0]!=z[g+2]){
st.insert(((g+2)%4)+1);
}
if(z[g+3]!=z[g+1]&&z[g+3]!=z[g+2]&&z[g+0]!=z[g+3]){
st.insert(((g+3)%4)+1);
}
for(int x:st)cout<<x;
cout<<endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |