Cod sursa(job #2654504)

Utilizator irimia_alexIrimia Alex irimia_alex Data 1 octombrie 2020 11:52:57
Problema Statistici de ordine Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#define NMAX 3000005

using namespace std;

int v[NMAX], n, k;

int partition(int begin, int end) {
    int p = rand() % (end - begin + 1) + begin;
    swap(v[begin], v[p]);
    p = v[p];
    int j = begin;
    for (int i = begin + 1;i <= end;++i) {
        if (v[i] <= p) swap(v[++j], v[i]);
    }
    swap(v[begin], v[j]);

    return j;
}

int kth_elem(int k) {
    --k;
    int i = 0, j = n - 1;
    while (true) {
        int p = partition(i, j);
        if (p == k)
            return v[p];
        if (p < k)
            i = p + 1;
        else j = p - 1;
    }
}

int main() {
    srand(time(NULL));

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

    fin >> n >> k;
    for (int i = 0;i < n;++i)
        fin >> v[i];

    fout << kth_elem(k);

    return 0;
}