using
System;
class
GFG
{
static
int
merge(
int
[]arr,
int
[]temp,
int
left,
int
mid,
int
right)
{
int
inv_count = 0;
int
i = left;
int
j = mid;
int
k = left;
while
((i <= mid - 1) && (j <= right))
{
if
(arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
inv_count = inv_count + (mid - i);
}
}
while
(i <= mid - 1)
{
temp[k++] = arr[i++];
}
while
(j <= right)
{
temp[k++] = arr[j++];
}
for
(i = left; i <= right; i++)
{
arr[i] = temp[i];
}
return
inv_count;
}
static
int
_mergeSort(
int
[]arr,
int
[]temp,
int
left,
int
right)
{
int
mid, inv_count = 0;
if
(right > left)
{
mid = (right + left) / 2;
inv_count = _mergeSort(arr, temp, left, mid);
inv_count += _mergeSort(arr, temp, mid + 1, right);
inv_count += merge(arr, temp, left, mid + 1, right);
}
return
inv_count;
}
static
int
mergeSort(
int
[]arr,
int
array_size)
{
int
[] temp =
new
int
[array_size];
return
_mergeSort(arr, temp, 0, array_size - 1);
}
static
int
minSwapToReachArr(
int
[]arr,
int
N)
{
for
(
int
i = 0; i < N; i++)
{
if
((arr[i] - 1) - i > 2)
{
return
-1;
}
}
int
numOfInversion = mergeSort(arr, N);
return
numOfInversion;
}
static
void
Main()
{
int
[]arr = {1, 2, 5, 3, 4};
int
N = arr.Length;
int
res = minSwapToReachArr(arr, N);
if
(res == -1)
Console.WriteLine(
"Not Possible"
);
else
Console.WriteLine(res);
}
}