Cod sursa(job #3145118)

Utilizator patrick_burasanPatrick Burasan patrick_burasan Data 12 august 2023 20:38:58
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <ctime>
#include <cstdio>

using namespace std;

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

inline void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

inline int partition(int *A, int const &st, int const &dr) {
    int lo = st - 1;
    int hi = dr - 1;
    for (int i = st; i <= hi; i++)
        if (A[i] <= A[dr]) {
            lo++;
            swap(&A[i], &A[lo]);
        }
    swap(&A[lo + 1], &A[dr]);
    return lo + 1;
}

inline int randomPartition(int *A, int const &st, int const &dr) {
    srand(time(NULL));
    int random = st + rand() % (dr - st + 1);
    swap(&A[random], &A[dr]);
    return partition(A, st, dr);
}

inline int quickSelect(int *A, int const &st, int const &dr, int const &k) {
    int piv = randomPartition(A, st, dr);

    if (piv == k)
        return A[piv];
    
    if (piv < k)
        return quickSelect(A, piv + 1, dr, k);
    
    return quickSelect(A, st, piv - 1, k);
}

int n, k, v[3000005];

int main() {
    fin >> n >> k;
    for (int i = 1; i <= n; i++) fin >> v[i];
    fout << quickSelect(v, 1, n, k) << '\n';
    fin.close();
    fout.close();
    return 0;   
}