using
System;
using
System.Collections;
class
GFG {
static
int
[] rightGreaterElement(
int
[] arr,
int
n)
{
int
[,] B =
new
int
[n,2];
for
(
int
i = 0; i < n; i++) {
B[i,0] = arr[i];
B[i,1] = i;
}
int
[] vec =
new
int
[n];
Array.Fill(vec, -1);
Stack st =
new
Stack();
for
(
int
i = 0; i < n; i++) {
if
(st.Count == 0) {
st.Push(
new
Tuple<
int
,
int
>(B[i,0], B[i,1]));
}
else
{
while
(st.Count > 0
&& ((Tuple<
int
,
int
>)st.Peek()).Item1 < B[i,0]) {
vec[((Tuple<
int
,
int
>)st.Peek()).Item2] = B[i,1];
st.Pop();
}
st.Push(
new
Tuple<
int
,
int
>(B[i,0], B[i,1]));
}
}
while
(st.Count > 0) {
vec[((Tuple<
int
,
int
>)st.Peek()).Item2] = n;
st.Pop();
}
return
vec;
}
static
int
[] leftGreaterElement(
int
[] arr,
int
n)
{
int
[,] B =
new
int
[n,2];
for
(
int
i = 0; i < n; i++) {
B[i,0] = arr[i];
B[i,1] = i;
}
int
[] vec =
new
int
[n];
Array.Fill(vec, -1);
Stack st =
new
Stack();
for
(
int
i = n - 1; i >= 0; i--) {
if
(st.Count == 0) {
st.Push(
new
Tuple<
int
,
int
>(B[i,0], B[i,1]));
}
else
{
while
(st.Count > 0
&& ((Tuple<
int
,
int
>)st.Peek()).Item1 < B[i,0]) {
vec[((Tuple<
int
,
int
>)st.Peek()).Item2] = B[i,1];
st.Pop();
}
st.Push(
new
Tuple<
int
,
int
>(B[i,0], B[i,1]));
}
}
while
(st.Count > 0) {
vec[((Tuple<
int
,
int
>)st.Peek()).Item2] = -1;
st.Pop();
}
return
vec;
}
static
void
maximumSubarrayLength(
int
[] arr,
int
N)
{
int
[] right = rightGreaterElement(arr, N);
int
[] left = leftGreaterElement(arr, N);
for
(
int
i = 0; i < N; i++) {
int
l = left[i];
int
r = right[i];
Console.Write((r - l - 1) +
" "
);
}
}
static
void
Main()
{
int
[] arr = { 62, 97, 49, 59, 54, 92, 21 };
int
N = arr.Length;
maximumSubarrayLength(arr, N);
}
}