Pagini recente » Cod sursa (job #2692473) | Cod sursa (job #265615) | Cod sursa (job #1542815) | Cod sursa (job #1112406) | Cod sursa (job #909552)
Cod sursa(job #909552)
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
class sdo {
public:
int get_pivot(int *V, int left, int right) {
if (left + 4 > right)
return (left + right) / 2;
int diff = right - left + 1;
vector<int> vec;
for (int i = 0; i < 5; i++)
vec.push_back(rand() % diff + left);
for (int i = 0; i < 5; i++) {
int cnt_left = 0, cnt_right = 0;
for (int j = 0; j < 5; j++)
if (j != i) {
if (V[vec[j]] <= V[vec[i]])
cnt_left++;
if (V[vec[j]] >= V[vec[i]])
cnt_right++;
}
if (cnt_left >= 2 && cnt_right >= 2)
return vec[i];
}
return left;
}
int get_kth(int* V, int left, int right, int k) {
if (left == right)
return left;
int p = get_pivot(V, left, right);
int p_val = V[p];
int poz = left;
int aux = V[p];
V[p] = V[right];
V[right] = aux;
for (int i = left; i < right; i++)
if (V[i] <= p_val) {
aux = V[poz];
V[poz] = V[i];
V[i] = aux;
poz++;
}
aux = V[poz];
V[poz] = V[right];
V[right] = aux;
if ((poz - left + 1) == k)
return poz;
if ((poz - left) >= k)
return get_kth(V, left, poz - 1, k);
return get_kth(V, poz + 1, right, k);
}
int get_kth(int N, int* V, int k) {
return get_kth(V, 0, N - 1, k);
}
};
int main()
{
freopen("sdo.in", "r", stdin);
freopen("sdo.out", "w", stdout);
srand(time(0));
int N, K;
scanf("%d %d", &N, &K);
int* V = new int[N];
for (int i = 0; i < N; i++)
scanf("%d", &V[i]);
sdo S;
printf("%d\n", V[S.get_kth(N, V, K)]);
delete[] V;
return 0;
}