import
java.util.*;
public
class
Solution {
private
List<Integer> sizeArr, parent;
private
void
makeSet(
int
v) {
parent.set(v, v);
}
private
int
findSet(
int
v) {
if
(v == parent.get(v)) {
return
v;
}
return
parent.set(v, findSet(parent.get(v)));
}
private
void
unionSets(
int
a,
int
b) {
a = findSet(a);
b = findSet(b);
if
(a != b) {
if
(sizeArr.get(a) < sizeArr.get(b)) {
int
temp = a;
a = b;
b = temp;
}
parent.set(b, a);
sizeArr.set(a, sizeArr.get(a) + sizeArr.get(b));
}
}
public
List<Boolean> friendRequests(
int
n, List<List<Integer>> restrictions, List<List<Integer>> requests) {
sizeArr =
new
ArrayList<>(n +
1
);
parent =
new
ArrayList<>(n +
1
);
for
(
int
i =
0
; i <= n; i++) {
parent.add(i);
sizeArr.add(
1
);
}
List<Boolean> res =
new
ArrayList<>();
for
(List<Integer> request : requests) {
int
u = request.get(
0
), v = request.get(
1
);
int
parU = findSet(u), parV = findSet(v);
boolean
flag =
true
;
if
(parU != parV) {
for
(List<Integer> restr : restrictions) {
int
restrU = restr.get(
0
), restrV = restr.get(
1
);
int
restrParU = findSet(restrU), restrParV = findSet(restrV);
if
((parU == restrParU && parV == restrParV) || (parV == restrParU && parU == restrParV)) {
flag =
false
;
break
;
}
}
if
(flag) {
unionSets(parU, parV);
}
}
res.add(flag);
}
return
res;
}
public
static
void
main(String[] args) {
int
n =
5
;
List<List<Integer>> restrictions = Arrays.asList(Arrays.asList(
0
,
1
), Arrays.asList(
1
,
2
), Arrays.asList(
2
,
3
));
List<List<Integer>> requests = Arrays.asList(Arrays.asList(
0
,
4
), Arrays.asList(
1
,
2
), Arrays.asList(
3
,
1
), Arrays.asList(
3
,
4
));
Solution solution =
new
Solution();
List<Boolean> res = solution.friendRequests(n, restrictions, requests);
for
(
boolean
it : res) {
if
(it) {
System.out.print("True ");
}
else
{
System.out.print("False ");
}
}
}
}