分析:不多yy,简单并查集,唯一难点就是记录已经修好的电脑,每次只遍历已经被修好的电脑,满足条件就加入;
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5+5;
int n,d,a,b;
char op;
int x[maxn],y[maxn],pre[maxn],pairs[maxn],len;
int find(int x){
if(pre[x]!=x) return pre[x]=find(pre[x]);
return pre[x];
}
void Union(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
int dis(int e,int f){
return (x[e]-x[f])*(x[e]-x[f])+(y[e]-y[f])*(y[e]-y[f]);
}
int main()
{
scanf("%d%d",&n,&d);
d*=d;
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=0;i<n;i++) pre[i]=i;
while (~scanf("%c ",&op)){
if(op=='O'){
scanf("%d",&a);
a--;
pairs[len++]=a; // 记录已经被修过的电脑
for(int i=0;i<len;i++) // 从已经被修好的电脑遍历
if(dis(pairs[i],a)<=d)
Union(pairs[i],a);
}
if(op=='S'){
scanf("%d%d",&a,&b);
a--,b--;
if(find(a)!=find(b))
printf("FAIL\n");
else
printf("SUCCESS\n");
}
}
}