Pagini recente » Cod sursa (job #1048165) | Cod sursa (job #750088) | Cod sursa (job #1582332) | Cod sursa (job #731305) | Cod sursa (job #2330289)
#include <fstream>
#include <random>
const int NMAX = 3000001;
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) {
std::mt19937 eng(rd());
std::uniform_int_distribution<> distr(a, b);
return distr(eng);
}
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 = randomInRange(left, right);
pivot = partition(left, right, pivot);
if (k == pivot)
return a[k];
if (k < pivot)
return select(left, pivot - 1, k);
return select(pivot + 1, right, k);
}
int main() {
in >> n >> k;
for (int i = 1; i <= n; ++i)
in >> a[i];
out << select(1, n, k);
return 0;
}