Cod sursa(job #2908633)

Utilizator StanCatalinStanCatalin StanCatalin Data 4 iunie 2022 19:20:45
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <random>
#include <fstream>

using namespace std;

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

const int dim = 3e6 + 6;

int n, vec[dim], sdo;

int Partition(int st, int dr) {
    int index = st + rand() % (dr - st + 1);
    swap(vec[dr], vec[index]);
    int pivot = dr;
    int k = st;
    for (int i = st; i <= dr; i++) {
        if (vec[i] < vec[pivot]) {
            swap(vec[i], vec[k]);
            k++;
        }
    }
    swap(vec[k], vec[pivot]);
    return k;
}

int quickselect(int sdo, int st, int dr) {
    int poz = Partition(st, dr);
    if (poz == sdo) return vec[poz];
    else if (poz > sdo) return quickselect(sdo, st, poz - 1);
    else return quickselect(sdo, poz + 1, dr);
}

int main() {
    srand(time(NULL));
    in >> n >> sdo;
    for (int i=1; i<=n; i++) {
        in >> vec[i];
    }
    out << quickselect(sdo, 1, n);
    return 0;
}