Cod sursa(job #1683991)

Utilizator BugirosRobert Bugiros Data 10 aprilie 2016 18:23:06
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

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

const int MAXN = 3000005;

int n,kk;
int v[MAXN];

void citire()
{
    in >> n >> kk;
    for (int i = 1;i <= n;++i)
        in >> v[i];
}

int partitionare(int st, int dr)
{
    int i = st;
    int j = dr;
    int pivot = v[rand() % (dr - st + 1) + st];
    int ipred = -1,jpred = -1;
    while(i < j)
    {
        ++i;
        while(v[i] < pivot)
            ++i;
        --j;
        while(v[j] > pivot)
            --j;
        if (i < j)
            swap(v[i], v[j]);

    }
    return j;
}

void selectie(int st, int dr, int k)
{
    if (st == dr)
        return;
    int poz = partitionare(st,dr);
    int rest = poz - st + 1;
    if (rest >= k)
        selectie(st, poz, k);
    else selectie(poz + 1,dr,k - rest);
}

int main()
{
    citire();
    srand(time(NULL));
    selectie(1,n,kk);
    out << v[kk] << '\n';
    return 0;
}