Cod sursa(job #2564887)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 2 martie 2020 10:52:02
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 3e6 + 5;

int N, K, A[NMAX];

static inline void Read ()
{
    f.tie(NULL);

    srand(time(NULL));

    f >> N >> K;

    for(int i = 1; i <= N; ++i)
        f >> A[i];

    return;
}

static inline int Partitie (int Left, int Right)
{
    int i = Left - 1, j = Right + 1, p = A[Left + (rand() % (Right - Left + 1))];

    for( ; ; )
    {
        do
        {
            ++i;
        }
        while(A[i] < p);

        do
        {
            --j;
        }
        while(p < A[j]);

        if(i < j)
            swap(A[i], A[j]);
        else
            return j;
    }

    return 0;
}

static inline int k_th_element (int Left, int Right, int k)
{
    if(Left == Right)
        return A[Left];

    int q = Partitie(Left, Right);
    int t = q - Left + 1;

    if(t >= k)
        return k_th_element(Left, q, k);

    return k_th_element(q + 1, Right, k - t);
}

int main()
{
    Read();

    g << k_th_element(1, N, K) << '\n';

    return 0;
}