{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
  public:
    vector<int> index;
    vector<int> temp;
    vector<int> tempIndex;
    vector<int> ans;

    void Merge(vector<int>& a, int l, int mid, int r) {
        int i = l, j = mid + 1, p = l;
        while (i <= mid && j <= r) {
            if (a[i] <= a[j]) {
                temp[p] = a[i];
                tempIndex[p] = index[i];
                ans[index[i]] += (j - mid - 1);
                ++i;
                ++p;
            } else {
                temp[p] = a[j];
                tempIndex[p] = index[j];
                ++j;
                ++p;
            }
        }
        while (i <= mid) {
            temp[p] = a[i];
            tempIndex[p] = index[i];
            ans[index[i]] += (j - mid - 1);
            ++i;
            ++p;
        }

        while (j <= r) {
            temp[p] = a[j];
            tempIndex[p] = index[j];
            ++j;
            ++p;
        }

        for (int k = l; k <= r; ++k) {
            index[k] = tempIndex[k];
            a[k] = temp[k];
        }
    }

    void MergeSort(vector<int>& a, int l, int r) {
        if (l >= r) {
            return;
        }
        int mid = (l + r) >> 1;
        MergeSort(a, l, mid);
        MergeSort(a, mid + 1, r);
        Merge(a, l, mid, r);
    }

    vector<int> smallerCount(vector<int>& nums) {
        index.resize(nums.size()); //存放原数组各元素对应的下标
        temp.resize(nums.size()); //原数组的副本
        tempIndex.resize(nums.size()); //存放副本数组各元素对应的下标
        ans.resize(nums.size()); //存放最终结果

        for (int i = 0; i < nums.size(); ++i) {
            index[i] = i;
        }

        int l = 0, r = nums.size() - 1;
        MergeSort(nums, l, r); //归并排序
        return ans;
    }
};