Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define MAX 100000
- int arr[MAX + 1];
- long long merge(int left, int mid, int right) {
- size_t m = mid - left + 1;
- size_t n = right - mid;
- int L[m], R[n];
- for(int i = left; i <= mid; ++i) L[i - left] = arr[i];
- for(int i = mid + 1; i <= right; ++i) R[i - mid - 1] = arr[i];
- int i = 0, j = 0, k = left;
- long long inversion = 0;
- while(i < m and j < n) {
- if(L[i] > R[j]) {
- inversion += m - i;
- arr[k++] = R[j++];
- } else {
- arr[k++] = L[i++];
- }
- }
- int l = i;
- while(i < m) {
- arr[k++] = L[i++];
- }
- while(j < n) {
- arr[k++] = R[j++];
- }
- return inversion;
- }
- long long mergeSort(int left, int right) {
- long long inversion = 0;
- if(left < right) {
- int mid = left + (right - left) / 2;
- inversion = mergeSort(left, mid);
- inversion += mergeSort(mid + 1, right);
- inversion += merge(left, mid, right);
- }
- return inversion;
- }
- int main(void) {
- freopen("input.txt", "r", stdin);
- int value;
- int indx = 0;
- while(scanf("%d", &value) != EOF) {
- arr[indx++] = value;
- }
- cout << mergeSort(0, MAX - 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment