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. for(int i = l; i < r; i++){
  21. cout << vec[i] << " ";
  22. }cout << endl;
  23. int i = l, j = mid;
  24. int k = 0;
  25. int ans1 = 0;
  26. while (j < r) {
  27. if(i + 1 == mid || vec[j] > vec[i]){
  28. // while(vec[k] < vec[j]){
  29. // ans1 -= vec[k];
  30. // k++;
  31. // }
  32. ans += vec[j] * (i - k) + ans1;
  33. // cout << ans << " " << k << endl;
  34. // cout << ans << " " << vec[j] << " " << ans1 << endl;
  35. j++;
  36. continue;
  37. }
  38. if (vec[i] > vec[j]) {
  39. i++;
  40. ans1 += vec[i];
  41. // cout << vec[i] << " ";
  42.  
  43. }
  44. }
  45. cout << endl;
  46.  
  47.  
  48. inplace_merge(vec.begin() + l, vec.begin() + mid, vec.begin() + r);
  49. return ans;
  50. }
  51.  
  52. signed main() {
  53. cin >> n;
  54. vec.resize(n);
  55. for (int i = 0; i < n; i++) {
  56. cin >> vec[i];
  57. }
  58. cout << recur(0, n) << endl;
  59. }
Success #stdin #stdout 0.01s 5284KB
stdin
5
5 4 2 1 3
stdout
5 4 

1 3 

2 1 3 

4 5 1 2 3 

38