import
java.util.*;
class
Pair<A, B> {
public
A first;
public
B second;
public
Pair(A first, B second)
{
this
.first = first;
this
.second = second;
}
}
public
class
IntervalIntersection {
public
static
void
findIntersection(List<Pair<Integer, Integer> > v,
int
n)
{
List<Pair<Integer, Integer> > data
=
new
ArrayList<>();
List<List<Integer> > answer =
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++) {
data.add(
new
Pair<Integer, Integer>(
v.get(i).first, i));
data.add(
new
Pair<Integer, Integer>(
v.get(i).second, i));
answer.add(
new
ArrayList<>());
}
Collections.sort(
data,
new
Comparator<Pair<Integer, Integer> >() {
public
int
compare(
Pair<Integer, Integer> p1,
Pair<Integer, Integer> p2)
{
return
p1.first.compareTo(p2.first);
}
});
int
curr =
0
;
Set<Pair<Integer, Integer> > s =
new
TreeSet<>(
new
Comparator<Pair<Integer, Integer> >() {
public
int
compare(
Pair<Integer, Integer> p1,
Pair<Integer, Integer> p2)
{
if
(p1.first.equals(p2.first)) {
return
p1.second.compareTo(
p2.second);
}
return
p1.first.compareTo(p2.first);
}
});
for
(Pair<Integer, Integer> it : data) {
if
(curr >= n)
break
;
if
(s.contains(it))
s.remove(it);
else
{
int
i = it.second;
int
j = v.get(i).second;
for
(Pair<Integer, Integer> k : s) {
if
(k.first > j)
break
;
int
index = k.second;
answer.get(i).add(index);
answer.get(index).add(i);
curr++;
if
(curr >= n)
break
;
}
s.add(
new
Pair<Integer, Integer>(j, i));
}
}
for
(
int
i =
0
; i < n; i++) {
System.out.print(
"{"
+ v.get(i).first +
", "
+ v.get(i).second +
"}"
+
" is intersecting with: "
);
for
(
int
j =
0
; j < answer.get(i).size(); j++)
System.out.print(
"{"
+ v.get(answer.get(i).get(j)).first
+
", "
+ v.get(answer.get(i).get(j)).second
+
"}"
+
" "
);
System.out.println();
}
}
public
static
void
main(String[] args)
{
int
n =
6
;
List<Pair<Integer, Integer> > v =
new
ArrayList<>();
v.add(
new
Pair<Integer, Integer>(
9
,
12
));
v.add(
new
Pair<Integer, Integer>(
2
,
11
));
v.add(
new
Pair<Integer, Integer>(
1
,
3
));
v.add(
new
Pair<Integer, Integer>(
6
,
10
));
v.add(
new
Pair<Integer, Integer>(
5
,
7
));
v.add(
new
Pair<Integer, Integer>(
4
,
8
));
findIntersection(v, n);
}
}