Pagini recente » Cod sursa (job #1952610) | Cod sursa (job #2933647) | Cod sursa (job #2095760) | Cod sursa (job #1417074) | Cod sursa (job #2330297)
#include <fstream>
//#include <random>
#include <cstdlib>
#include <ctime>
const int NMAX = 3000005;
int n, k, a[NMAX];
std::ifstream in("sdo.in");
std::ofstream out("sdo.out");
//std::random_device rd;
int randomInRange(int a, int b) {
//static std::mt19937 eng(rd());
//std::uniform_int_distribution<> distr(a, b);
//return distr(eng);
return (rand() % (b + 1 - a)) + a;
}
int partition(int left, int right, int pivot) {
int pivotVal = a[pivot];
std::swap(a[pivot], a[right]);
int index = left;
for (int i = left; i < right; ++i) {
if (a[i] < pivotVal) {
std::swap(a[index], a[i]);
++index;
}
}
std::swap(a[right], a[index]);
return index;
}
int select(int left, int right, int k) {
if (left == right)
return a[left];
int pivot = partition(left, right, randomInRange(left, right));
if (k == pivot)
return a[k];
if (k < pivot)
return select(left, pivot - 1, k);
return select(pivot + 1, right, k);
}
int main() {
srand(time(NULL));
in >> n >> k;
for (int i = 1; i <= n; ++i)
in >> a[i];
out << select(1, n, k);
return 0;
}