Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- void Merge(long* arr, int begin, int end, long long* p_a) {
- int i = begin;
- int mid = begin + (end - begin) / 2;
- int j = mid + 1;
- int k = 0;
- long d[end - begin];
- while (i <= mid && j <= end) {
- if (arr[i] <= arr[j]) {
- d[k] = arr[i];
- i++;
- }
- else {
- d[k] = arr[j];
- j++; *p_a += mid + 1 - i;
- }
- k++;
- }
- while (i <= mid) {
- d[k] = arr[i];
- i++; k++;
- }
- while (j <= end) {
- d[k] = arr[j];
- j++; k++;
- }
- for (i = 0; i < k; ++i) {
- arr[begin + i] = d[i];
- }
- }
- void Merge_Sort(long* arr, int left, int right, long long* p_a) {
- if (left < right) {
- if (right - left == 1) {
- if (arr[left] > arr[right]) {
- std::swap(arr[left], arr[right]);
- *p_a += 1;
- }
- }
- else {
- Merge_Sort(arr, left, left + (right - left) / 2, p_a);
- Merge_Sort(arr, left + (right - left) / 2 + 1, right, p_a);
- Merge(arr, left, right, p_a);
- }
- }
- }
- int main() {
- int n;
- long long a;
- long long* p_a = &a;
- std::ifstream in("inversions.in");
- in >> n;
- long arr[n];
- for (int i = 0; i < n; ++i) {
- in >> arr[i];
- }
- Merge_Sort(arr, 0, n - 1, p_a);
- std::ofstream out("inversions.out");
- out << *p_a;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement