package Week1;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/*
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4 并查集 O开始的修复该电脑,S问答a和b是否联通
list存修复的点,读到O开头的每次修复的点与list已修复点的集合比较,看安全距离小于等于D则表示连通,否则不连通
*/
public class C_Wireless {
static int N,D;
static int p[];
static Node nodes[];
static List<Integer> list = new ArrayList<Integer>();
public static void main(String[] args) throws Exception{
System.setIn(new FileInputStream("Solution.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
D = Integer.parseInt(st.nextToken());
nodes = new Node[N+1];
p = new int[N+1];
for (int i = 1; i <= N; i++) {
p[i]=i;
}
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
nodes[i]=new Node(x, y);
}
while(br.ready()) {
st = new StringTokenizer(br.readLine());
String q = st.nextToken();
if("O".equals(q)) {
int point = Integer.parseInt(st.nextToken());
list.add(point);
for (int i = 0; i < list.size(); i++) {
int idx = list.get(i);
Node a = nodes[point];
Node b = nodes[idx];
if(isConnect(a,b,D)) {
union(point,idx);
}
}
}
if("S".equals(q)) {
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
if(find(x)==find(y)) {
System.out.println("SUCCESS");
}else {
System.out.println("FAIL");
}
}
}
}
public static void union(int x,int y) {
int a = find(x);
int b = find(y);
if(a == b) {
return ;
}
if(a < b) {
p[b]=a;
}
if(a > b) {
p[a]=b;
}
}
private static int find(int i) {
if(i==p[i]) {
return i;
}
return p[i]=find(p[i]);
}
public static boolean isConnect(Node a,Node b,int D) {
double temp = Math.pow((a.x-b.x),2)+Math.pow((a.y-b.y), 2);
if(temp <= D*D) {
return true;
}
return false;
}
}
class Node {
int x,y;
public Node(int x,int y) {
this.x=x;
this.y=y;
}
}