Cod sursa(job #3352318)

Utilizator rapidu36Victor Manz rapidu36 Data 26 aprilie 2026 15:36:55
Problema Statistici de ordine Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 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;
}