并查集。。。判断距离。。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e5+5;
struct node
{
int x,y;
int pre;
}nd[maxn];
int n,m,d;char op[20];bool vis[maxn];
inline void init(int n){for(int i=1;i<=n;i++)nd[i].pre=i;}
inline int find(int x){return x==nd[x].pre ? x:find(nd[x].pre);}
inline int dis(node a, node b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}
inline void unite(node a,node b)
{
int rt1=find(a.pre), rt2=find(b.pre);
if(rt1 != rt2)
{
if(dis(a, b) <= d*d)
nd[rt2].pre=rt1;
}
}
int main()
{
scanf("%d%d",&n,&d); init(n);
memset(vis, false, sizeof vis);
for(int i=1;i<=n;i++)scanf("%d%d",&nd[i].x,&nd[i].y);
while(~scanf("\n%s",op))
{
if(op[0]=='O')
{
scanf("%d",&m);
vis[m] = true;
for(int i=1;i<=n;i++)
{
if(vis[i] && i!=m)
unite(nd[m], nd[i]);
}
}
else
{
int a,b;scanf("%d%d",&a,&b);
if(find(a) == find(b))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}