Cod sursa(job #728879)

Utilizator sana1987Laurentiu Dascalu sana1987 Data 29 martie 2012 05:35:27
Problema Statistici de ordine Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#include <stdlib.h>

int n, k, i;
int data[3000001];

int part(int inf, int sup) {
    int pivot = inf + rand() % (sup - inf + 1);
    int i = inf - 1, j = sup + 1, tmp;

    while (1) {
        do {
            i++;
        } while(data[i] < data[pivot]);
        do {
            j--;
        } while(data[j] > data[pivot]);
        if (i < j) {
            tmp = data[i];
            data[i] = data[j];
            data[j] = tmp;
        }
        else
            return j;
    }
    return 0;
}

int elem = -1;

void kthelem(int inf, int sup, int k) {
    if (inf == sup)
        return;

    int index = part(inf, sup);

    if (index == k) {
        elem = data[inf + index];
        return;
    }

    if (index > k)
        kthelem(inf, index - 1, k);
    else
        kthelem(index + 1, sup, k - index - 1);
}

int main() {
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
        
    scanf("%d %d", &n, &k);

    for (i = 0; i < n; i++) {
        scanf("%d", &data[i]);
    }

    kthelem(0, n - 1, k - 1);
    printf("%d\n", elem);

    return 0;
}