Cod sursa(job #2233584)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 23 august 2018 17:28:19
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <ctime>
const int MAX = 3e6;
std::ifstream f("sdo.in");
std::ofstream g("sdo.out");
int v[MAX + 5];
int part(int, int);
void selection(int, int, int);
int main() {
    int N, K;
    f >> N >> K;
    for(int i = 1; i <= N; ++i)
        f >> v[i];
    selection(1, N, K);
    g << v[K];
    return 0x0;
}
int part(int left, int right) {
    int i = left - 1, j = right + 1, pivot = v[left + (rand() % (right - left + 1))];
    while(1) {
        do {
            ++i;
        } while (v[i] < pivot);
        do {
            --j;
        } while (pivot < v[j]);
        if (i < j)
            std::swap(v[i], v[j]);
        else
            return j;
    }
    return 0;
}
void selection(int left, int right, int k) {
    if(left == right)
        return;
    int indexOfPivot = part(left, right);
    int referenceIndex = indexOfPivot - left + 1;
    if(referenceIndex >= k)
        selection(left, indexOfPivot, k);
    else
        selection(indexOfPivot + 1, right, k - referenceIndex);
}