using
System;
using
System.Collections.Generic;
class
Program
{
const
int
N = 2005;
static
int
n, m, ans;
static
int
[] par =
new
int
[N];
static
int
[] Rank =
new
int
[N];
static
List<Tuple<
int
, Tuple<
int
,
int
>>> edges =
new
List<Tuple<
int
, Tuple<
int
,
int
>>>();
static
List<Tuple<
int
, Tuple<
int
,
int
>>> mst =
new
List<Tuple<
int
, Tuple<
int
,
int
>>>();
static
Queue<Tuple<
int
,
int
>> zeroes =
new
Queue<Tuple<
int
,
int
>>();
static
void
Initialize()
{
for
(
int
i = 0; i <= n; i++)
{
par[i] = i;
Rank[i] = 0;
}
}
static
void
AddEdge(
int
u,
int
v,
int
weight)
{
edges.Add(
new
Tuple<
int
, Tuple<
int
,
int
>>(weight,
new
Tuple<
int
,
int
>(u, v)));
}
static
int
Find(
int
x)
{
if
(par[x] != x)
{
par[x] = Find(par[x]);
}
return
par[x];
}
static
void
Union(
int
x,
int
y)
{
int
xroot = Find(x);
int
yroot = Find(y);
if
(Rank[xroot] < Rank[yroot])
{
par[xroot] = yroot;
}
else
if
(Rank[xroot] > Rank[yroot])
{
par[yroot] = xroot;
}
else
{
par[yroot] = xroot;
Rank[xroot]++;
}
}
static
void
ComputeMST()
{
ans = 0;
edges.Sort();
for
(
int
i = 0; i < m; i++)
{
int
u = Find(edges[i].Item2.Item1);
int
v = Find(edges[i].Item2.Item2);
if
(u == v)
{
continue
;
}
mst.Add(edges[i]);
ans += edges[i].Item1;
Union(u, v);
}
}
static
void
ModifiedKruskal(Tuple<
int
,
int
> x)
{
Initialize();
ans = 0;
int
sz = zeroes.Count;
for
(
int
i = 0; i < sz; i++)
{
Tuple<
int
,
int
> front = zeroes.Dequeue();
if
(front.Item1 == x.Item1 && front.Item2 == x.Item2)
{
continue
;
}
Union(front.Item1, front.Item2);
zeroes.Enqueue(front);
}
for
(
int
i = 0; i < mst.Count; i++)
{
int
u = Find(mst[i].Item2.Item1);
int
v = Find(mst[i].Item2.Item2);
if
(u == v)
{
continue
;
}
ans += mst[i].Item1;
Union(u, v);
}
}
static
void
Query(
int
type,
int
u = 0,
int
v = 0)
{
if
(type == 2)
{
zeroes.Enqueue(
new
Tuple<
int
,
int
>(u, v));
ModifiedKruskal(
new
Tuple<
int
,
int
>(-1, -1));
}
else
if
(type == 3)
{
zeroes.Enqueue(
new
Tuple<
int
,
int
>(u, v));
ModifiedKruskal(
new
Tuple<
int
,
int
>(u, v));
}
else
{
Console.WriteLine(ans);
}
}
static
void
Main()
{
n = 4;
m = 4;
Initialize();
AddEdge(1, 2, 1);
AddEdge(2, 3, 1);
AddEdge(3, 4, 1);
AddEdge(4, 1, 1);
ComputeMST();
Query(2, 1, 2);
Query(1);
Query(3, 1, 2);
Query(1);
}
}