Cod sursa(job #2572335)

Utilizator MichaelXcXCiuciulete Mihai MichaelXcX Data 5 martie 2020 12:30:56
Problema Statistici de ordine Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

const char* in  = "sdo.in";
const char* out = "sdo.out";

const int NMAX = 1e6 * 3;
int N, A[NMAX], K;

inline int partitie(int Arr[NMAX], int st, int dr) {
    int pivot = Arr[st + rand() % (dr - st + 1)],
        i     = st - 1,
        j     = dr + 1;

    while(true) {
        do{
            ++i;
        }while(Arr[i] < pivot);

        do{
            --j;
        }while(Arr[j] > pivot);

        if(i >= j)
            return j;

        swap(Arr[i], Arr[j]);
    }
}

inline void Sol(int Arr[NMAX], int st, int dr, int k)
{
    if(st == dr)
        return; //end process

    int piv = partitie(Arr, st, dr);
    int t = piv - st + 1;

    if(t >= k)
        Sol(Arr, st, piv, k);
    else
        Sol(Arr, piv + 1, dr, k - t);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    srand(time(NULL)); //set the seed

    cin >> N >> K;
    for(int i = 1; i <= N; ++i)
        cin >> A[i];
    Sol(A, 1, N, K);

    cout << A[K] << "\n";

    return 0;
}