Pagini recente » Cod sursa (job #1160988) | Cod sursa (job #567028) | Cod sursa (job #270538) | Cod sursa (job #3243674) | Cod sursa (job #2909827)
//
// Created by mihai145 on 16.06.2022.
//
#include <fstream>
#include <vector>
#include <algorithm>
std::ifstream cin("sdo.in");
std::ofstream cout("sdo.out");
int select(std::vector<int> &, int);
int median_of_medians(std::vector<int> &);
int get_median(std::vector<int> &, int, int);
int main() {
int n, k;
cin >> n >> k;
std::vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
cout << select(v, k - 1) << '\n';
return 0;
}
int get_median(std::vector<int> &v, int l, int r) {
std::vector<int> seq;
for (int i = l; i <= r; i++) {
seq.push_back(v[i]);
}
std::sort(seq.begin(), seq.end());
return seq[seq.size() / 2];
}
int median_of_medians(std::vector<int> &v) {
std::vector<int> medians;
for (int i = 0; i < (int) v.size(); i += 5) {
medians.push_back(get_median(v, i, std::min(i + 4, (int) v.size() - 1)));
}
return select(medians, (int) medians.size() / 2);
}
int select(std::vector<int> &v, int stat) {
if (v.size() == 1) {
return v[0];
}
int p = median_of_medians(v);
std::vector<int> left, right;
for (int x: v) {
if (x < p) {
left.push_back(x);
} else {
right.push_back(x);
}
}
if (left.size() == stat) {
return p;
}
if (left.size() > stat) {
return select(left, stat);
}
return select(right, stat - (int) left.size());
}