Pagini recente » Cod sursa (job #3251779) | Cod sursa (job #3289681) | Cod sursa (job #3272555) | Cod sursa (job #3289685) | Cod sursa (job #536275)
Cod sursa(job #536275)
#include <stdlib.h>
#include <fstream>
#include <iostream>
using namespace std;
#define MAXN 3000000
int vec[MAXN];
int aux_swap;
inline void swap(int* v, int p1, int p2) {
aux_swap = v[p1]; v[p1] = v[p2]; v[p2] = aux_swap;
}
int get_k_th(int* vec, int left, int right, int k) {
if (left==right) {
return vec[left];
}
int len = right - left + 1;
int index_piv = left + rand() % len;
int piv_value = vec[index_piv];
int index_left = left;
int index_right = right;
swap(vec, index_right, index_piv);
index_piv = left;
for (int i=left; i<right; i++) {
if (vec[i] < piv_value) {
swap(vec, index_piv, i);
index_piv++;
}
}
swap(vec, index_piv, right);
if (index_piv-left+1 >= k) {
return get_k_th(vec, left, index_piv, k);
} else {
return get_k_th(vec, index_piv+1, right, k-(index_piv-left+1));
}
}
int main() {
fstream in("sdo.in", fstream::in);
fstream out("sdo.out", fstream::out);
int n, k;
in >> n >> k;
for (int i=0; i<n; i++) {
in >> vec[i];
}
out << get_k_th(vec, 0, n-1, k) << endl;
out.close();
return 0;
}