using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG{
static
int
findParent(
int
i, ArrayList parent)
{
if
((
int
)parent[i] == i)
return
i;
return
findParent((
int
)parent[i], parent);
}
static
void
findUnion(
int
x,
int
y,
ArrayList parent,
ArrayList rank)
{
int
xroot = findParent(x, parent);
int
yroot = findParent(y, parent);
if
(xroot != yroot)
{
if
((
int
)rank[xroot] > (
int
)rank[yroot])
{
parent[y] = x;
rank[xroot] = (
int
)rank[xroot] + 1;
}
else
if
((
int
)rank[x] < (
int
)rank[y])
{
parent[x] = y;
rank[yroot] = (
int
)rank[yroot] + 1;
}
else
{
parent[y] = x;
rank[xroot] = (
int
)rank[xroot] + 1;
}
}
}
static
bool
isInvalid(ArrayList u, ArrayList v,
ArrayList op,
int
n)
{
ArrayList parent =
new
ArrayList();
ArrayList rank =
new
ArrayList();
parent.Add(-1);
rank.Add(-1);
for
(
int
i = 1; i <= n; i++)
parent.Add(i);
for
(
int
i = 1; i <= n; i++)
rank.Add(0);
for
(
int
i = 0; i < n; i++)
if
((
string
)op[i] ==
"="
)
findUnion((
int
)u[i],
(
int
)v[i],
parent, rank);
for
(
int
i = 0; i < n; i++)
{
if
((
string
)op[i] ==
"!="
)
{
if
(findParent((
int
)u[i], parent) ==
findParent((
int
)v[i], parent))
return
true
;
}
}
return
false
;
}
public
static
void
Main(
string
[] args)
{
ArrayList u =
new
ArrayList();
ArrayList v =
new
ArrayList();
ArrayList op =
new
ArrayList();
u.Add(1);
u.Add(2);
u.Add(3);
v.Add(2);
v.Add(3);
v.Add(1);
op.Add(
"="
);
op.Add(
"="
);
op.Add(
"!="
);
int
n = u.Count;
if
(isInvalid(u, v, op, n))
Console.Write(
"Invalid"
);
else
Console.Write(
"Valid"
);
}
}