fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. vector<int> vec;
  5. int n;
  6.  
  7. int recur(int l, int r) {
  8. int ans = 0;
  9. if (l + 1 >= r) {
  10. return ans;
  11. }
  12. int mid = (l + r) / 2;
  13. ans += recur(l, mid);
  14. ans += recur(mid, r);
  15.  
  16. // Debugging output
  17. // cout << l << " " << r << endl;
  18.  
  19. // Count inversions
  20. int i = l, j = mid;
  21. int k = 0;
  22. int ans1 = 0;
  23. while (j < r) {
  24. if(i + 1 == mid || vec[j] > vec[i]){
  25. // while(vec[k] < vec[j]){
  26. // ans1 -= vec[k];
  27. // k++;
  28. // }
  29. ans += vec[j] * (i - k) + ans1;
  30. // cout << ans << " " << k << endl;
  31. // cout << ans << " " << vec[j] << " " << ans1 << endl;
  32. j++;
  33. continue;
  34. }
  35. if (vec[i] > vec[j]) {
  36. i++;
  37. ans1 += vec[i];
  38. cout << vec[i] << " ";
  39.  
  40. }
  41. }
  42. cout << endl;
  43.  
  44.  
  45. inplace_merge(vec.begin() + l, vec.begin() + mid, vec.begin() + r);
  46. return ans;
  47. }
  48.  
  49. signed main() {
  50. cin >> n;
  51. vec.resize(n);
  52. for (int i = 0; i < n; i++) {
  53. cin >> vec[i];
  54. }
  55. cout << recur(0, n) << endl;
  56. }
Success #stdin #stdout 0.01s 5288KB
stdin
5
5 4 2 1 3
stdout


5 
38