import
java.util.*;
class
UnionFind {
private
List<Integer> parent, size;
public
void
initialize(
int
n)
{
parent =
new
ArrayList<>(
Collections.nCopies(n +
2
,
0
));
size =
new
ArrayList<>(
Collections.nCopies(n +
2
,
1
));
for
(
int
i =
0
; i <= n; i++) {
parent.set(i, i);
}
}
public
int
find(
int
u)
{
if
(u == parent.get(u)) {
return
u;
}
parent.set(u, find(parent.get(u)));
return
parent.get(u);
}
public
void
merge(
int
u,
int
v)
{
u = find(u);
v = find(v);
if
(u == v) {
return
;
}
size.set(u, size.get(u) + size.get(v));
parent.set(v, u);
}
public
int
getSize(
int
X)
{
return
size.get(find(X));
}
}
public
class
GFG {
public
static
List<List<Integer> >
processGraph(List<List<Integer> > G,
List<List<Integer> > query,
int
N,
int
M)
{
List<List<Integer> > processedEdges
=
new
ArrayList<>();
for
(List<Integer> edge : G) {
int
u = edge.get(
0
), v = edge.get(
1
),
w = edge.get(
2
);
processedEdges.add(Arrays.asList(w, u, v,
0
));
}
int
index =
0
;
for
(List<Integer> q : query) {
int
a = q.get(
0
);
int
z = q.get(
1
);
processedEdges.add(
Arrays.asList(z, index, a,
1
));
index++;
}
processedEdges.sort((a, b) -> {
if
(a.get(
0
).equals(b.get(
0
))) {
return
Integer.compare(b.get(
3
), a.get(
3
));
}
return
Integer.compare(b.get(
0
), a.get(
0
));
});
return
processedEdges;
}
public
static
void
solve(
int
N,
int
M,
List<List<Integer> > G,
List<List<Integer> > query)
{
List<List<Integer> > graphSorted
= processGraph(G, query, N, M);
UnionFind UF =
new
UnionFind();
UF.initialize(N);
List<Integer> res =
new
ArrayList<>(
Collections.nCopies(query.size(),
0
));
for
(List<Integer> itr : graphSorted) {
if
(itr.get(
3
) ==
1
) {
int
a = itr.get(
2
), w = itr.get(
0
),
index = itr.get(
1
);
res.set(index, UF.getSize(UF.find(a)));
}
else
{
int
u = itr.get(
1
), v = itr.get(
2
);
UF.merge(u, v);
}
}
for
(
int
answer : res) {
System.out.println(answer);
}
}
public
static
void
main(String[] args)
{
int
N =
4
, M =
3
;
List<List<Integer> > G = Arrays.asList(
Arrays.asList(
1
,
2
,
1
), Arrays.asList(
1
,
3
,
2
),
Arrays.asList(
3
,
4
,
3
));
List<List<Integer> > query = Arrays.asList(
Arrays.asList(
1
,
1
), Arrays.asList(
2
,
0
),
Arrays.asList(
3
,
1
));
solve(N, M, G, query);
}
}