using
System;
using
System.Collections.Generic;
class
GFG {
static
void
Merge(List<Tuple<
int
,
int
> > list,
List<
int
> ans,
int
low,
int
mid,
int
high)
{
int
n1 = mid - low + 1;
int
n2 = high - mid;
List<Tuple<
int
,
int
> > leftArr
=
new
List<Tuple<
int
,
int
> >();
List<Tuple<
int
,
int
> > rightArr
=
new
List<Tuple<
int
,
int
> >();
for
(
int
x = 0; x < n1; x++) {
leftArr.Add(list[x + low]);
}
for
(
int
y = 0; y < n2; y++) {
rightArr.Add(list[y + mid + 1]);
}
int
i = 0;
int
j = 0;
int
k = low;
while
(i < n1 && j < n2) {
if
(leftArr[i].Item1 < rightArr[j].Item1) {
ans[leftArr[i].Item2] += n2 - j;
list[k] = leftArr[i];
i++;
k++;
}
else
{
list[k] = rightArr[j];
j++;
k++;
}
}
while
(i < n1) {
list[k] = leftArr[i];
i++;
k++;
}
while
(j < n2) {
list[k] = rightArr[j];
j++;
k++;
}
}
static
void
MergeSort(List<Tuple<
int
,
int
> > list,
List<
int
> ans,
int
low,
int
high)
{
if
(low < high) {
int
mid = low + (high - low) / 2;
MergeSort(list, ans, low, mid);
MergeSort(list, ans, mid + 1, high);
Merge(list, ans, low, mid, high);
}
}
static
void
NextGreaterElements(
int
n, List<
int
> nums,
int
queries,
List<
int
> indices)
{
List<Tuple<
int
,
int
> > list
=
new
List<Tuple<
int
,
int
> >();
for
(
int
i = 0; i < n; i++) {
list.Add(
new
Tuple<
int
,
int
>(nums[i], i));
}
List<
int
> ans =
new
List<
int
>(
new
int
[n]);
MergeSort(list, ans, 0, n - 1);
for
(
int
j = 0; j < queries; j++) {
int
k = indices[j];
Console.Write(ans[k] +
" "
);
}
}
static
void
Main()
{
List<
int
> nums
=
new
List<
int
>{ 3, 4, 2, 7, 5, 8, 10, 6 };
int
queries = 2;
List<
int
> indices =
new
List<
int
>{ 0, 5 };
NextGreaterElements(nums.Count, nums, queries,
indices);
}
}