using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
GFG
{
public
static
long
[] GetDistances(
long
[] arr)
{
int
n = arr.Length;
Dictionary<
long
, Tuple<
long
,
long
>> unmap =
new
Dictionary<
long
, Tuple<
long
,
long
>>(),
unmap2 =
new
Dictionary<
long
, Tuple<
long
,
long
>>();
for
(
int
i = 0; i < n; i++)
{
if
(unmap.ContainsKey(arr[i]))
{
unmap[arr[i]] =
new
Tuple<
long
,
long
>(unmap[arr[i]].Item1 + 1, unmap[arr[i]].Item2 + i);
}
else
{
unmap.Add(arr[i],
new
Tuple<
long
,
long
>(1, i));
}
}
long
[] result =
new
long
[n];
for
(
int
i = 0; i < n; i++)
{
Tuple<
long
,
long
> curr = unmap2.ContainsKey(arr[i]) ? unmap2[arr[i]] :
new
Tuple<
long
,
long
>(0, 0);
long
leftSum = curr.Item2;
long
leftFreq = curr.Item1;
long
rightSum = unmap[arr[i]].Item2 - leftSum - i;
long
rightFreq = unmap[arr[i]].Item1 - leftFreq - 1;
result[i] = (leftFreq * i) - leftSum + rightSum - (rightFreq * i);
if
(unmap2.ContainsKey(arr[i]))
{
unmap2[arr[i]] =
new
Tuple<
long
,
long
>(unmap2[arr[i]].Item1 + 1, unmap2[arr[i]].Item2 + i);
}
else
{
unmap2.Add(arr[i],
new
Tuple<
long
,
long
>(1, i));
}
}
return
result;
}
static
public
void
Main (){
long
[] arr = { 2, 1, 4, 1, 2, 4, 4 };
long
[] result = GetDistances(arr);
foreach
(
long
i
in
result)
{
Console.Write(i+
" "
);
}
}
}