并查集
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 1010
using namespace std;
int f[N],n,d;
bool vis[N];
struct point
{
int x,y;
}p[N];
#define sqr(a) ((a)*(a))
inline bool dis(point a,point b){return sqr(a.x-b.x)+sqr(a.y-b.y)<=sqr(d);}
#undef sqr
int find(int x)
{
if(f[x]==x)return x;
return f[x]=find(f[x]);
}
char get_char()
{
char c,ch[1000];gets(ch);
while((c=getchar())!='O'&&c!='S')
if(c=EOF)exit(0);
return c;
}//因为有很多空格其实最好用cin
void repair()
{
int x;
scanf("%d",&x);--x;
vis[x]=1;
for(int i=0;i<n;i++)
if(i!=x&&dis(p[i],p[x])&&vis[i])//注意是要两台电脑都修好且距离小于d
{
int a=find(x),b=find(i);
f[a]=b;
}
}
void test()
{
int x,y;
scanf("%d%d",&x,&y);
--x;--y;
x=find(x);y=find(y);
if(x==y)puts("SUCCESS");
else puts("FAIL");
}
int main()
{
scanf("%d%d",&n,&d);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y),f[i]=i;
while(1)
{
char c=get_char();
if(c=='O')repair();
else test();
}
}