Cod sursa(job #2291466)

Utilizator ifrimencoAlexandru Ifrimenco ifrimenco Data 28 noiembrie 2018 02:14:56
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <random>
using namespace std;

int n, v[3000005];

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

int alegere_pivot(int st, int dr) {
    int random = st + rand() % (dr - st);
    //cout << random << " ";
    return random;
}

int partitie (int st, int dr) {
    //cout << v[dr] << ": ";
    int pivot = v[dr];
    int i = st, j = dr - 1;
    while (i <= j) {
        if (v[i] >= pivot && v[j] < pivot) swap(v[i], v[j]);
        if (v[i] < pivot) i++;
        if (v[j] >= pivot) j--;
    }
    swap(v[i], v[dr]);
    //for (int i = 0; i < n; ++i) cout << v[i] << " ";
    //cout << "\n";
    return i;
}

int quickselect(int st, int dr, int k) {
    if (st >= dr) return st;
    int pivot = alegere_pivot(st, dr);
    swap(v[pivot], v[dr]);
    int ret = partitie(st, dr);
    if (ret > k) return quickselect(st, ret - 1, k);
    if (ret < k) return quickselect(ret + 1, dr, k);
    return ret;
}

int main()
{
    int n, poz;
    fin >> n >> poz;
    poz--;
    for (int i = 0; i < n; ++i) {
        fin >> v[i];
    }

    quickselect(0, n - 1, poz);
    fout << v[poz];
    return 0;
}