Cod sursa(job #2279641)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 9 noiembrie 2018 20:36:21
Problema Statistici de ordine Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <ctime>
#include <cstdlib>
#include <cstdio>

#define VMAX 3000010

int n, k;
int v[VMAX];

int partition(int lo, int hi) {
    int rnd = rand() % (hi - lo + 1) + lo;
    int aux = v[rnd];

    v[rnd] = v[hi];
    v[hi] = aux;

    int p = v[lo];
    int l = lo, r = hi;

    while (l < r) {
        while (l < r && v[r] >= p)
            r--;
        v[l] = v[r];

        while (l < r && v[l] <= p)
            l++;
        v[r] = v[l];
    }

    v[r] = p;
    return r;
}

int quick(int lo, int hi) {
    int pivot = partition(lo, hi);
    if (pivot == k)
        return v[k];

    if (k < pivot) {
        if (pivot - 1 > lo)
            return quick(lo, pivot - 1);
        return v[k];
    }

    if (pivot + 1 < hi)
        return quick(pivot + 1, hi);
    return v[k];
}

int main() {
    int i;
    srand(time(NULL));

    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);

    scanf("%d %d\n", &n, &k);
    for (i = 1; i <= n; i++)
        scanf("%d ", &v[i]);

    printf("%d\n", quick(1, n));
    fclose(stdout);
    return 0;
}