Pagini recente » Cod sursa (job #829383) | Cod sursa (job #2266495) | Cod sursa (job #156127) | Cod sursa (job #581140) | Cod sursa (job #3332595)
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <ctime>
#include <cassert>
using namespace std;
// https://cplusplus.com/reference/random/mersenne_twister_engine/operator()/
mt19937 rng(time(nullptr));
int nth_elem(vector<int>& v, int st, int dr, int k) {
if (st >= dr) {
assert(st == dr && st == k);
return v[k];
}
int pos = st + rng() % (dr - st + 1);
int p = v[pos];
swap(v[pos], v[dr]);
int j = st;
for (int i = st; i < dr; i++) {
if (v[i] < p) {
swap(v[i], v[j]);
j++;
}
}
swap(v[j], v[dr]);
if (j == k) {
return p;
} else if (j < k) {
return nth_elem(v, j + 1, dr, k);
} else {
return nth_elem(v, st, j - 1, k);
}
}
int main() {
ifstream cin("sdo.in");
ofstream cout("sdo.out");
int n, k; cin >> n >> k;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
cout << nth_elem(v, 0, n - 1, k - 1) << "\n";
return 0;
}