Cod sursa(job #2572383)

Utilizator MichaelXcXCiuciulete Mihai MichaelXcX Data 5 martie 2020 12:39:32
Problema Statistici de ordine Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 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 int Sol(int Arr[NMAX], int st, int dr, int k)
{
    while(st <= dr) {
        int pivIdx = partitie(Arr, st, dr);

        if(pivIdx == k)
            return A[pivIdx];

        if(pivIdx > k)
            dr = --pivIdx;
        else
            st = ++pivIdx;
    }
    return -1;
}

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];
    int sol = Sol(A, 1, N, K);

    cout << sol << "\n";

    return 0;
}