Cod sursa(job #3295290)

Utilizator fabiplavatPlavat Fabian-Remus fabiplavat Data 4 mai 2025 00:07:30
Problema Invers modular Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int count;  // number of times this value appears
    int indexleft, indexright;
    struct node *st, *dr;
} node;

node* create_node(int left, int right) {
    node* newnode = (node*)malloc(sizeof(node));
    newnode->count = 0;
    newnode->indexleft = left;
    newnode->indexright = right;
    newnode->st = NULL;
    newnode->dr = NULL;
    return newnode;
}

void update(node **tree, int pos, int left, int right) {
    if (*tree == NULL)
        *tree = create_node(left, right);

    (*tree)->count += 1;

    if (left == right)
        return;

    int mid = (left + right) / 2;
    if (pos <= mid)
        update(&(*tree)->st, pos, left, mid);
    else
        update(&(*tree)->dr, pos, mid + 1, right);
}

int query(node *tree, int qleft, int qright) {
    if (tree == NULL || qright < tree->indexleft || qleft > tree->indexright)
        return 0;

    if (qleft <= tree->indexleft && tree->indexright <= qright)
        return tree->count;

    return query(tree->st, qleft, qright) + query(tree->dr, qleft, qright);
}

int main() {
    int n;
    FILE* in = fopen("inv.in", "r");
    FILE* out = fopen("inv.out", "w");

    fscanf(in, "%d", &n);
    int *arr = (int*)malloc(n * sizeof(int));
    int max_val = 0;

    for (int i = 0; i < n; i++) {
        fscanf(in, "%d", &arr[i]);
        if (arr[i] > max_val)
            max_val = arr[i];
    }

    node *tree = NULL;
    long long inversions = 0;

    for (int i = n - 1; i >= 0; i--) {
        inversions += query(tree, 1, arr[i] - 1);  // count how many smaller seen
        update(&tree, arr[i], 1, max_val);         // mark current number as seen
    }

    fprintf(out, "%lld\n", inversions);

    free(arr);
    fclose(in);
    fclose(out);
    return 0;
}