Cod sursa(job #2452958)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 1 septembrie 2019 20:50:26
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <cstdlib>
using namespace std;

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

int a[3000001];

int divide(int st, int dr)
{
    int p ,i, j;
    p = a[st+rand()%(dr-st+1)];
    i = st-1;
    j = dr+1;
    while (1)
    {
        do
        {
            i++;
        } while (a[i] < p);
        
        do
        {
            j--;
        } while (a[j] > p);
        
        if (i>=j)
        {
            return j;
        }
        swap(a[i], a[j]);
    }
}

void select(int st, int dr, int k)
{
    if (st < dr)
    {
        int p = divide(st, dr);
        int d = p-st+1;
        if (d >= k) //m-am dus prea in dreapta
            select(st, p, k);
        else //m-am dus prea in stanga
            select(p+1, dr, k-d);
    }
}

int main()
{
    int n, i, K;
    fin >> n >> K;
    for (i = 1; i<=n; i++)
        fin >> a[i];
    srand(time(NULL));
    select(1, n, K);
    fout << a[K];
    return 0;
}