using
System;
using
System.Collections.Generic;
public
class
Pair {
public
int
first, second;
public
Pair(
int
fi,
int
se)
{
first = fi;
second = se;
}
}
public
class
GFG {
public
static
int
getMinMoves(
int
N,
int
K,
int
[] nums)
{
List<
int
> nger =
new
List<
int
>();
for
(
int
i = 0; i < N; i++) {
nger.Add(0);
}
Stack<
int
> s =
new
Stack<
int
>();
for
(
int
i = N - 1; i >= 0; i--) {
while
(s.Count != 0
&& nums[(
int
)s.Peek()] <= nums[i]) {
s.Pop();
}
if
(s.Count == 0) {
nger[i] = -1;
}
else
{
nger[i] = s.Peek();
}
s.Push(i);
}
while
(s.Count != 0) {
s.Pop();
}
List<
int
> ngel =
new
List<
int
>();
for
(
int
i = 0; i < N; i++) {
ngel.Add(0);
}
for
(
int
i = 0; i < N; i++) {
while
(s.Count != 0
&& nums[(
int
)s.Peek()] <= nums[i]) {
s.Pop();
}
if
(s.Count == 0) {
ngel[i] = -1;
}
else
{
nger[i] = s.Peek();
}
s.Push(i);
}
Queue<Pair> q =
new
Queue<Pair>();
Pair p =
new
Pair(K, 0);
q.Enqueue(p);
List<
bool
> visited =
new
List<
bool
>();
for
(
int
i = 0; i < N; i++) {
visited.Add(
false
);
}
visited[K] =
true
;
while
(q.Count != 0) {
Pair par = q.Peek();
q.Dequeue();
int
currentIndex = par.first;
int
minimumMoves = par.second;
if
(currentIndex == N - 1) {
return
minimumMoves;
}
int
child1 = ngel[currentIndex];
int
child2 = nger[currentIndex];
if
(child1 != -1 && visited[child1] ==
false
) {
Pair temp
=
new
Pair(child1, minimumMoves + 1);
q.Enqueue(temp);
visited[child1] =
true
;
}
if
(child2 != -1 && visited[child2] ==
false
) {
Pair temp
=
new
Pair(child2, minimumMoves + 1);
q.Enqueue(temp);
visited[child2] =
true
;
}
}
return
-1;
}
static
public
void
Main()
{
int
K = 0;
int
[] nums = { 0, -1, 2 };
int
N = nums.Length;
int
minMoves = getMinMoves(N, K, nums);
Console.Write(minMoves);
}
}