Cod sursa(job #3352358)

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

#define N 3000000

int v[N];

void amesteca(int v[], int n);
void interschimba(int *pa, int *pb);
int partitie(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);
    amesteca(v, n);
    int st = 0, dr = n - 1;
    while (st < dr) {
        int p = partitie(v, st, dr);
        if (k < p) {
            dr = p;
        } else if (k > p) {
            st = p + 1;
        } else {
            st = dr;
        }
    }
    FILE *out = fopen("sdo.out", "w");
    fprintf(out, "%d\n", v[k]);
    fclose(out);
    return 0;
}

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

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

int partitie(int v[], int st, int dr) {
    int pivot = v[dr];
    int i = st, poz = st;
    while (i < dr) {
        if (v[i] <= pivot) {
            interschimba(&v[i], &v[poz++]);
        }
        i++;
    }
    interschimba(&v[poz], &v[dr]);
    return poz;
}