Cod sursa(job #2198061)

Utilizator LivcristiTerebes Liviu Livcristi Data 23 aprilie 2018 15:09:03
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#define NUM 3000000
typedef unsigned int u_int;
u_int v[NUM];
u_int n, k;
using namespace std;
void schimb(u_int &a, u_int &b)
{
    u_int aux = a;
    a = b;
    b = aux;
}
u_int partitie(u_int *v, u_int st, u_int dr)
{
    u_int pivot = v[dr];
    u_int i = st;
    for(u_int j = st; j < dr; ++j)
        if(v[j] < pivot)
            schimb(v[i++], v[j]);
    schimb(v[dr], v[i]);
    return i;
}
u_int randomPartition(u_int *v, u_int st, u_int dr)
{
    u_int n = dr-st+1;
    u_int pivot = rand() % n;
    schimb(v[st + pivot], v[dr]);
    return partitie(v, st, dr);
}
u_int el_k(u_int *v, u_int st, u_int dr, u_int k)
{
    if(k > 0 && k <= dr - st + 1)
    {
        u_int p = randomPartition(v, st, dr);
        if(p - st == k - 1)
            return v[p];

        if(p - st > k - 1)
            return el_k(v, st, p - 1, k);
        return el_k(v, p + 1, dr, k - p + st - 1);
    }
}
int main()
{
    ifstream f("sdo.in");
    ofstream g("sdo.out");
    f >> n >> k;
    for(u_int i = 0; i < n; ++i)
        f >> v[i];
    g << el_k(v, 0, n - 1, k);
    f.close();
    g.close();
}