Pagini recente » Cod sursa (job #1973324) | Cod sursa (job #2416847) | Cod sursa (job #2341130) | Rezultatele filtrării | Cod sursa (job #3295290)
#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;
}