Cod sursa(job #2522450)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 12 ianuarie 2020 15:54:22
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

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

int partition(vector <int> &m, int l, int r) {
    int pivot = l + rand() % (r - l + 1);
    swap(m[pivot], m[r]);
    int st = l, dr = r - 1;
    while (true) {
        while (m[st] < m[r])
            st++;
        while (m[dr] > m[r])
            dr--;
        if (st < dr) {
            swap(m[st], m[dr]);
            st++;
            dr--;
        }
        else
            return st;
    }
}
int quickselect(vector <int> &m, int k, int l, int r) {
    if (l == r)
        return m[l];
    int p = partition(m, l, r);
    swap(m[p], m[r]);
    if (p + 1 == k) {
        return m[p];
    }
    if (k < p + 1) {
        return quickselect(m, k, l, p - 1);
    }
    return quickselect(m, k, p + 1, r);
}

int main() {
    int n, k;
    in >> n >> k;
    vector <int> m(n);
    for (int i = 0; i < n; i++) {
        in >> m[i];    
    }

    srand(time(NULL));
    out << quickselect(m, k, 0, n - 1) << '\n';
    return 0;
}