Cod sursa(job #2613868)

Utilizator ddeliaioanaaDumitrescu Delia Ioana ddeliaioanaa Data 10 mai 2020 19:40:07
Problema Statistici de ordine Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

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

int n, k;
std::vector <int> v;

int getPivot(std::vector<int> v)
{
    std::vector < std::vector <int> > subliste;
    std::vector <int> aux;
    std::vector <int> mid;

    if(v.size() <= 5)
    {
        sort(v.begin(), v.end());
        return v[v.size() / 2];
    }

    int i = 0, j;
    while(i < v.size())
    {
        for(j = i; j < i + 5; j++)
            aux.push_back(v[j]);

        sort(aux.begin(), aux.end());
        subliste.push_back(aux);
        i += 5;
    }
    for(i = 0; i < subliste.size(); i++)
        mid.push_back(subliste[i][subliste[i].size()/2]);

    return getPivot(mid);
}

int quickSelect(std::vector<int> v, int k)
{
    std::vector <int> L;
    std::vector <int> E;
    std::vector <int> G;
    int pivot = getPivot(v);

    for(int i = 0; i < v.size(); i ++)
        if(v[i] < pivot)
            L.push_back(v[i]);
        else if(v[i] == pivot)
            E.push_back(v[i]);
        else
            G.push_back(v[i]);

    if(k <= L.size())
        return quickSelect(L, k);
    else if(k <= L.size() + E.size())
        return E[0];
    else
        return quickSelect(G, k - L.size() - E.size());
}

int main()
{
    int i, val;
    fin >> n >> k;

    for(i = 0; i < n; i++)
    {
        fin >> val;
        v.push_back(val);
    }

    fout << quickSelect(v, k);

    return 0;
}