Cod sursa(job #1373557)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 4 martie 2015 19:29:45
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
#include <random>


void shuffle(std::vector<int> &v)
{
    std::random_device rd;
    std::mt19937 e1(rd());

    for (auto i = 0u; i < v.size(); ++i) {
        std::uniform_int_distribution<int> uniform_dist(0, i + 1);
        std::swap(v[i], v[uniform_dist(e1)]);
    }
}

int select_impl(std::vector<int>& v, int low, int high, int k)
{
    auto lt = low, gt = high, i = low;
    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)
{
    shuffle(v);
    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;
}