Cod sursa(job #2007665)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 3 august 2017 17:04:02
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

int v[3000005];

int splitPivot(int st, int dr, int pivot) {
    int a = st - 1, b = st;
    while(b <= dr) {
        if(v[b] <= pivot) {
            ++ a;
            swap(v[a], v[b]);
        }
        ++ b;
    }
    return a;
}

void cautaK(int st, int dr, int k) {
    if(st == dr) {
        printf("%d\n", v[st]);
    } else {
        int pivot = v[rand() % (dr - st + 1) + st];
        int poz = splitPivot(st, dr, pivot);
        int ord = poz - st + 1;
        if(k <= ord) {
            cautaK(st, poz, k);
        } else {
            cautaK(poz + 1, dr, k - ord);
        }
    }
}

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

    srand(time(NULL));

    int n, k;
    scanf("%d%d", &n, &k);

    for(int i = 1; i <= n; ++ i) {
        scanf("%d", &v[i]);
    }

    cautaK(1, n, k);

    return 0;
}