Cod sursa(job #3352329)

Utilizator rapidu36Victor Manz rapidu36 Data 26 aprilie 2026 17:45:42
Problema Statistici de ordine Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdio.h>
#include <stdlib.h>

#define N 3000000

int v[N];

void shuffle(int v[], int n);
void swap(int *pa, int *pb);
int partition(int v[], int st, int dr);

int main(void) {
    FILE *in = fopen("sdo.in", "r");
    int n, k;
    fscanf(in, "%d%d", &n, &k);
    k--;
    for (int i = 0; i < n; i++) {
        fscanf(in, "%d", &v[i]);
    }
    fclose(in);
    shuffle(v, n);
    int st = 0, dr = n - 1;
    while (st <= dr) {
        int p = partition(v, st, dr);
        if (k < p) {
            dr = p - 1;
        } else if (k > p) {
            st = p + 1;
        } else {
            dr = st - 1;
        }
    }
    FILE *out = fopen("sdo.out", "w");
    fprintf(out, "%d\n", v[k]);
    fclose(out);
    return 0;
}

void shuffle(int v[], int n) {
    for (int i = n - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        swap(&v[i], &v[j]);
    }
}

void swap(int *pa, int *pb) {
    int t = *pa;
    *pa = *pb;
    *pb = t;
}

/*
int partition(int v[], int st, int dr) {
    int pivot = v[dr];
    int i = st, poz = st;
    while (i < dr) {
        if (v[i] <= pivot) {
            swap(&v[i], &v[poz++]);
        }
        i++;
    }
    swap(&v[poz], &v[dr]);
    return poz;
}
*/
int partition(int v[], int st, int dr) {
    // printf("Trebuie sa partitionam vectorul:\n");
    // for (int i = st; i <= dr; i++) {
    //     printf("%d ", v[i]);
    // }
    // printf("\n");
    int pivot = v[st+(dr-st)/2];
    int i = st - 1, j = dr + 1;
    while (i < j) {
        do {
            i++;
        } while (v[i] < pivot);
        // printf("ne oprim in stanga pe pozitia %d la %d\n", i, v[i]);
        do {
            j--;
        } while (v[j] > pivot);
        // printf("ne oprim in dreapta pe pozitia %d la %d\n", j, v[j]);
        if (i >= j) {
            return j;
        }
        swap(&v[i], &v[j]);
    }
    // printf("Pivotul a fost %d\n", pivot);
    // for (int i = st; i <= dr; i++) {
    //     printf("%d ", v[i]);
    // }
    // printf("\n");
    return j;
}