Cod sursa(job #2538604)

Utilizator nicu_ducalNicu Ducal nicu_ducal Data 4 februarie 2020 21:09:56
Problema Statistici de ordine Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 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 randomIndex = rand() % a.size();
    ll p = a[randomIndex];
    vector <ll> A;
    for (ll i = 0; i < a.size(); i++)
        if (a[i] < p)
            A.pb(a[i]);
    if ((k - 1) < A.size())
        return quickselect(A, k);
    ll n = A.size();
    A.clear();

    for (ll i = 0; i < a.size(); i++)
        if (a[i] == p)
            A.pb(a[i]);
    if ((k - 1) < n + A.size())
        return A[0];
    n += A.size();
    A.clear();
    for (ll i = 0; i < a.size(); i++)
        if (a[i] > p)
            A.pb(a[i]);
    return quickselect(A, k - n);
}

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;
}