Cod sursa(job #1443310)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 27 mai 2015 16:48:39
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>

int select_impl(std::vector<int>& v, int low, int high, int k)
{
    auto lt = low, gt = high, i = low;
    auto pivIdx = rand() % (high - low + 1) + low;

    std::swap(v[lt], v[pivIdx]);
    auto pivot = v[lt];

    while (i <= gt) {
        if (v[i] < pivot)
            std::swap(v[i++], v[lt++]);
        else if (v[i] > pivot)
            std::swap(v[i], v[gt--]);
        else
            ++i;
    }

    return k >= lt && k <= gt ? v[lt] :
                                k > gt ? select_impl(v, gt + 1, high, k) :
                                         select_impl(v, low, lt - 1, k);
}

int select(std::vector<int>& v, int k)
{
    std::srand(time(nullptr));
    return select_impl(v, 0, v.size() - 1, k);
}

int main()
{
    std::ifstream fin{"sdo.in"};
    std::ofstream fout{"sdo.out"};

    int N, K;
    fin >> N >> K;

    std::vector<int> v(N);
    for (auto &i : v)
        fin >> i;

    fout << select(v, K - 1) << std::endl;
    return 0;
}