Cod sursa(job #2538574)

Utilizator nicu_ducalNicu Ducal nicu_ducal Data 4 februarie 2020 20:53:22
Problema Statistici de ordine Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
typedef unsigned long long ul;
typedef long long ll;
using namespace std;

ll n, k, c;

ll bfprt(vector <ll> a)
{
    if (a.size() <= 5)
        return a[a.size() / 2];

    vector <ll> sublista, mediana;
    ll sz = a.size();
    for (ll i = 0; i < sz; i += 5)
    {
        for (ll j = i; j < min(i + 5, sz); j++)
            sublista.pb(a[j]);
        sort(sublista.begin(), sublista.end());
        mediana.pb(sublista[sublista.size() / 2]);
        sublista.clear();
    }
    return bfprt(mediana);
}

ll quickselect(vector <ll> a, ll k)
{
    ll p = bfprt(a);
    vector <ll> L, E, H;
    for (ll i = 0; i < a.size(); i++)
    {
        if (a[i] < p)
            L.pb(a[i]);
        else if (a[i] == p)
            E.pb(a[i]);
        else
            H.pb(a[i]);
    }

    if ((k - 1) < L.size())
        return quickselect(L, k);
    else if ((k - 1) < L.size() + E.size())
        return E[0];
    else
        return quickselect(H, k - L.size() - E.size());
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(); cout.tie();
    ifstream cin("sdo.in");
    ofstream cout("sdo.out");

    vector <ll> a;
    cin >> n >> k;
    for (ll i = 0; i < n; i++)
    {
        cin >> c;
        a.pb(c);
    }

    cout << quickselect(a, k);

    return 0;
}