Cod sursa(job #1783261)

Utilizator crazylamaRiclea Andrei crazylama Data 18 octombrie 2016 21:46:02
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <cstdlib>
#define mod 9917
using namespace std;

FILE *f = fopen("inv.in", "r");
FILE *g = fopen("inv.out", "w");

int inv;

int* Interclaseaza(int *v1, int n, int *v2, int m) {
    int i1 = 0, i2 = 0, k = 0;
    int *c = (int*)calloc(n + m + 1, sizeof(int));
    while (i1 < n && i2 < m) {
        if(v1[i1] > v2[i2]) {
            c[k++] = v2[i2];
            i2++;
            inv = (inv + n - i1) % mod;
        } else {
            c[k++] = v1[i1];
            i1++;
        }
    }
    while (i1 < n) {
        c[k++] = v1[i1];
        i1++;
    }
    while (i2 < m) {
        c[k++] = v2[i2];
        i2++;
    }
    return c;
}

int* MergeSort(int* v, int n) {
    int m = n / 2, *v1, *v2;
    if(n > 1) {
        v1 = MergeSort(v, m);
        v2 = MergeSort(v + m, n - m);
        int* rez = Interclaseaza(v1, m, v2, n - m);
        return rez;
    } else {
        return v;
    }
}

int main()
{
    int n;
    fscanf(f, "%d", &n);
    int *v = (int*)calloc(n + 1, sizeof(int));
    for (int i = 0; i < n; i++)
        fscanf(f, "%d", &v[i]);
    MergeSort(v, n);
    fprintf(g, "%d", inv);
    return 0;
}