using
System;
public
class
GFG
{
static
int
Find(
int
[] parent,
int
a)
{
return
parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
static
void
Union(
int
[] parent,
int
[] rank,
int
[] total,
int
a,
int
b)
{
a = Find(parent, a);
b = Find(parent, b);
if
(a == b)
return
;
if
(rank[a] == rank[b]) {
rank[a]++;
}
if
(rank[a] < rank[b]) {
int
temp = a;
a = b;
b = temp;
}
parent[b] = a;
total[a] += total[b];
}
static
void
findTotNumOfSet(
int
[,] arr,
int
[] queries,
int
R,
int
N,
int
M)
{
int
[] parent =
new
int
[R + 1];
int
[] rank =
new
int
[R + 1];
int
[] total =
new
int
[R + 1];
for
(
int
i = 0; i < total.Length; i++) {
total[i] = 1;
}
for
(
int
i = 1; i < R + 1; i++) {
parent[i] = i;
}
for
(
int
i = 0; i < N; i++) {
Union(parent, rank, total,
arr[i,0],
arr[i,1]);
}
for
(
int
i = 0; i < M; i++) {
int
P = Find(parent, queries[i]);
Console.Write(total[P]+
" "
);
}
}
public
static
void
Main(String[] args)
{
int
R = 5;
int
[,] arr = { { 1, 2 },
{ 2, 3 },
{ 4, 5 } };
int
[] queries = { 2, 4, 1, 3 };
int
N = arr.GetLength(0);
int
M = queries.GetLength(0);
findTotNumOfSet(arr, queries, R, N, M);
}
}