
```C
typedef struct Node {int num; // 值int index; // 原数组索引int size; // 逆序对数量
} Node;class Solution {
public:void mergeSort(vector<Node> &arr, int left, int right) {if (left >= right) return;int mid = (left + right) >> 1;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);vector<Node> temp;int i = left, j = mid + 1;while (i <= mid && j <= right) {if (arr[i].num <= arr[j].num) {temp.push_back(arr[j++]);} else {// 每当左半区偏大时,与右半区剩余偏小元素构成逆序arr[i].size += right - j + 1;temp.push_back(arr[i++]);}}while (i <= mid) {temp.push_back(arr[i++]);}while (j <= right) {temp.push_back(arr[j++]);}for (int i = left, j = 0; i <= right; i++, j++) {arr[i] = temp[j];}}vector<int> countSmaller(vector<int> &nums) {vector<Node> arr;for (int i = 0; i < nums.size(); i++) {arr.push_back(Node{nums[i], i, 0});}mergeSort(arr, 0, arr.size() - 1);// 按照索引生成结果vector<int> result(nums.size());for (const auto &node : arr) {result[node.index] = node.size;}return result;}
};