Pagini recente » Cod sursa (job #1369320) | Cod sursa (job #2155120) | Cod sursa (job #2280709) | Cod sursa (job #3256743) | Cod sursa (job #1430809)
#include <iostream>
#include <fstream>
#include <ctime>
#define NMAX 3000000
const char IN[] = "sdo.in", OUT[] = "sdo.out";
using namespace std;
int v[NMAX];
int N, K;
inline void swap(int poz1, int poz2) {
if (&v[poz1] != &v[poz2]) {
v[poz1] = v[poz1] ^ v[poz2];
v[poz2] = v[poz2] ^ v[poz1];
v[poz1] = v[poz1] ^ v[poz2];
}
}
inline void readData() {
freopen(IN, "r", stdin);
scanf("%d %d", &N, &K);
for (int i = 0; i < N; ++i) scanf(" %d", &v[i]);
fclose(stdin);
}
inline int partition(int low, int high, int pivot) {
int pivotval = v[pivot];
swap(pivot, high);
int index = low;
for (int i = low; i < high; ++i) {
if (v[i] < pivotval) swap(i, index), ++index;
}
swap(high, index);
return index;
}
int find_kth(int low, int high) {
if (low > high) return -1;
int m = low + rand() % ((high==low)?1:(high-low));
int index = partition(low, high, m);
if (index == K - 1) return v[index];
if (index < K) return find_kth(index + 1, high);
return find_kth(low, index - 1);
}
int main() {
readData();
srand(time(NULL));
freopen(OUT, "w", stdout);
cout << find_kth(0, N - 1);
fclose(stdout);
return 0;
}