using
System;
class
GFG{
class
dsu
{
public
dsu(){}
public
int
[] parent;
public
int
[] maximum_node;
public
int
[] minimum_node;
public
int
[] visited;
public
void
init(
int
n)
{
parent =
new
int
[n];
maximum_node =
new
int
[n];
minimum_node =
new
int
[n];
visited =
new
int
[n];
for
(
int
i = 0; i < n; i++)
{
parent[i] = i;
maximum_node[i] = i;
minimum_node[i] = i;
visited[i] = 0;
}
}
public
int
getsuperparent(
int
x)
{
if
(x == parent[x])
return
x;
else
{
parent[x] = getsuperparent(parent[x]);
return
parent[x];
}
}
public
void
unite(
int
x,
int
y)
{
int
superparent_x = getsuperparent(x);
int
superparent_y = getsuperparent(y);
parent[superparent_x] = superparent_y;
maximum_node[superparent_y] = Math.Max(
maximum_node[superparent_y],
maximum_node[superparent_x]);
minimum_node[superparent_y] = Math.Min(
minimum_node[superparent_y],
minimum_node[superparent_x]);
}
};
static
dsu G =
new
dsu();
static
int
minimumEdgesToBeAdded(
int
n)
{
int
answer = 0;
for
(
int
i = 0; i < n; i++)
{
int
temp = G.getsuperparent(i);
if
(G.visited[temp] == 0)
{
G.visited[temp] = 1;
for
(
int
j = G.minimum_node[temp];
j <= G.maximum_node[temp]; j++)
{
if
(G.getsuperparent(j) !=
G.getsuperparent(i))
{
G.unite(i, j);
answer++;
}
}
}
}
return
answer;
}
public
static
void
Main(String[] args)
{
int
N = 7;
G.init(N);
G.unite(1, 5);
G.unite(2, 4);
G.unite(3, 4);
Console.Write(minimumEdgesToBeAdded(N));
}
}