Cod sursa(job #2522636)

Utilizator flibiaVisanu Cristian flibia Data 12 ianuarie 2020 19:11:16
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define ll long long 
#define fi first
#define se second
#define ld long double

using namespace std;

ifstream in("sdo.in");
ofstream out("sdo.out");

default_random_engine generator;
int n, k, a[3000100], h[3000100];

int kth(int st, int dr, int k) {
    if (st == dr)
        return a[st];

    uniform_int_distribution<int> distribution(st, dr);
    int piv = distribution(generator);

    int l = st, r = dr;
    int cnt = 0;
    for (int i = st; i <= dr; i++) {
        if (a[i] <= a[piv]) {
            h[l++] = a[i];
            cnt++;
        } else 
            h[r--] = a[i]; 
    }
    
    for (int i = st; i <= dr; i++)
        a[i] = h[i];

    if (cnt >= k)
        return kth(st, st + cnt - 1, k);
    return kth(st + cnt, dr, k - cnt);
}

int main() {
    ios_base::sync_with_stdio(0);
    in.tie(NULL);

    in >> n >> k;
    for (int i = 1; i <= n; i++)
        in >> a[i];

    out << kth(1, n, k);

    return 0;
}