普通的并查集操作
#include <iostream>
#include <cmath>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=1010;
int id[maxn],size[maxn],x[maxn],y[maxn],n,d;
vector<int>g[maxn];
bool isRepaired[maxn];
double dis(int x1,int y1,int x2,int y2){
return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int find(int p){
return p==id[p]?p:id[p]=find(id[p]);
}
void uni(int p,int q){
int pp=find(p),pq=find(q);
if(pp==pq)return;
if (size[pp]>size[pq]){
id[pq]=p;
size[pp]+=size[pq];
}else{
id[pp]=pq;
size[pq]+=size[pp];
}
}
int main(){
scanf("%d%d",&n,&d);
for (int i=1;i<=n;++i)
{
id[i]=i;
size[i]=1;
isRepaired[i]=false;
scanf("%d%d",&x[i],&y[i]);
}
for (int i=1;i<=n;++i)
{
for (int j=i+1;j<=n;++j)
{
if(dis(x[i],y[i],x[j],y[j])<=d){
g[i].push_back(j);
g[j].push_back(i);
}
}
}
char str[2];
while (scanf("%s",str)==1){
int a,b;
if(str[0]=='O'){
scanf("%d\n",&a);
if(isRepaired[a]==0){
isRepaired[a]=1;
for (int i=0;i<g[a].size();++i)
{
if(isRepaired[g[a][i]]){
uni(a,g[a][i]);
}
}
}
}else{
scanf("%d%d",&a,&b);
if(find(a)!=find(b)){
printf("FAIL\n");
}else{
printf("SUCCESS\n");
}
}
}
return 0;
}