Cod sursa(job #2891636)

Utilizator ViAlexVisan Alexandru ViAlex Data 19 aprilie 2022 12:32:14
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include<iostream>
#include<fstream>
#include<cstdio>

using namespace std;
ifstream in("sdo.in");
ofstream out("sdo.out");

const int mx = 3e6 + 100;
int n, k, v[mx];

int partition(int l, int r) {

    int ran = rand() % (r - l + 1) + l;
    swap(v[r], v[ran]);

    int pivot = r;
    int index = l;

    for (int i = l; i <= r; i++) {
        if (v[i] < v[pivot]) {
            swap(v[i], v[index]);
            index++;
        }
    }
    swap(v[index], v[pivot]);
    return index;
}

int kth(int l, int r, int kt) {
    int pivot = partition(l, r);
    int left = pivot - l;

    if (kt - 1 == left) {
        return v[pivot];
    } else if (kt - 1 < left) {
        return kth(l, pivot - 1, kt);
    } else {
        return kth(pivot + 1, r, kt - left - 1);
    }
}

void read() {
    in >> n >> k;
    for (int i = 0; i < n; i++) {
        in >> v[i];
    }
}

void solve() {
    out << kth(0, n - 1, k);
}

int main() {
    read();
    solve();
    return 0;
}