Pagini recente » Cod sursa (job #3242569) | Cod sursa (job #3261418) | Cod sursa (job #1888562) | Cod sursa (job #951892) | Cod sursa (job #1439249)
#include <cstdlib>
#include <fstream>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int N, K, *v;
int _partition(int *v, int st, int dr, int value) {
int i = st, j = dr;
while (i < j) {
while (i < j && v[i] < value) i++;
while (i < j && v[j] > value) j--;
if (i < j) {
std::swap(v[i], v[j]);
} else {
return j;
}
}
return 0;
}
void nth_element(int *v, int st, int dr, int k) {
if (k == 1) {
int minim = v[st], poz = st;
for (int i = st + 1; i <= dr; i++) {
if (v[i] < minim) {
minim = v[i];
poz = i;
}
}
std::swap(v[st], v[poz]);
return;
}
int N = (dr - st + 1), pivot = v[ st + rand() % N];
int p = _partition(v, st, dr, pivot), cnt = (p - st + 1);
if (cnt >= k) {
nth_element(v, st, p, k);
} else {
nth_element(v, p+1, dr, k - cnt);
}
}
int main() {
f >> N >> K;
v = new int[N];
for (int i = 1; i <= N; i++) {
f >> v[i];
}
nth_element(v, 1, N, K);
g << v[K] << '\n';
f.close();
g.close();
delete v;
return 0;
}