Cod sursa(job #2611476)

Utilizator BourucLiviuBouruc Petru Liviu BourucLiviu Data 6 mai 2020 22:29:31
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>

using namespace std;

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

int n, v[3000005];

int part(int st, int dr)
{
    swap(v[rand() % (dr-st+1) + st], v[dr]);
    int pivot = v[dr];
    for(int i = st; i < dr; ++i)
        if(v[i] <= pivot)
        {
            swap(v[st], v[i]);
            st++;
        }
    swap(v[st], v[dr]);
    return st;
}

int quickselect(int st, int dr, int k)
{
    int pos = part(st, dr);
    if(pos - st + 1 == k) return v[pos];
    if(pos - st + 1 > k) return quickselect(st, pos-1, k);
    return quickselect(pos+1, dr, k-pos+st-1);
}

int main()
{
    int k;
    fin >> n >> k;
    for(int i = 1; i <= n; ++i) fin >> v[i];
    fout << quickselect(1, n, k);
    fin.close(); fout.close();
    return 0;
}