裸的并查集问题,我是用的可行数组存的,至于哈希表和坐标离散化之类的方法也可以优化吧
//164K 954MS
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct Point{
int x, y;
};
Point a[1001+5];
int par[1001+5];
int well[1001+5];
int N, d, cnt;
inline int squdis(Point p1, Point p2){
return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
}
void init(){
for(int i=1; i<=N; i++)
par[i] = i;
}
int find(int x){
if(par[x] == x) return x;
else return par[x] = find(par[x]);
}
inline void bing(int x, int y){
int px = find(x);
int py = find(y);
if(px != py) par[px] = py;
}
inline bool same(int x, int y){
return find(x) == find(y);
}
int main(){
while(~scanf("%d %d", &N, &d)){
for(int i=1; i<=N; i++)
scanf("%d %d", &a[i].x, &a[i].y);
char str[2];
int p, q;
init();
cnt = 1;
while(~scanf("%s", str)){
if(str[0] == 'O'){
scanf("%d", &p);
well[cnt++] = p;
for(int i=1; i<cnt; i++){
if(squdis(a[well[i]], a[p]) <= d*d){
bing(well[i], p);
}
}
}
else{
scanf("%d %d", &p, &q);
if(same(p, q)) puts("SUCCESS");
else puts("FAIL");
}
}
}
return 0;
}