Cod sursa(job #728882)

Utilizator sana1987Laurentiu Dascalu sana1987 Data 29 martie 2012 08:14:01
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

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

    while (1) {
        do {
            i++;
        } while(data[i] < pivot);

        do {
            j--;
        } while(data[j] > pivot);

        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 q = part(inf, sup);
    int t = q - inf + 1;
    
    if(t >= k)
        kthelem(inf, q, k);
    else
        kthelem(q+1, sup, k-t);
}

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 + 1]);
    }

    kthelem(1, n, k);
    printf("%d\n", data[k]);

    return 0;
}