Cod sursa(job #728880)

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

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

int part(int inf, int sup) {
    int pivot = data[inf + rand() % (sup - inf)];
    int i = inf, j = sup;

    while (1) {
        while(data[i] < pivot && i < sup) {
            i++;
        }
        while(data[j] > pivot && j > inf) {
            j--;
        }
        if (i >= j)
            return j;

        int tmp = data[i];
        data[i] = data[j];
        data[j] = tmp;
    }
    return -1;
}

int elem = -1;

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

    int index = part(inf, sup) - inf;

    if (index == k) {
        elem = data[inf + index];
        return;
    }
    else if (index > k) {
        kthelem(inf, index, k);
    }
    else {
        kthelem(index, sup, k - index);
    }
}

int main() {
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
  
    srand ( time(NULL) );
    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;
}