Pagini recente » Cod sursa (job #1790862) | Cod sursa (job #1633819) | Cod sursa (job #2827549) | Cod sursa (job #1894121) | Cod sursa (job #1628310)
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <fstream>
typedef unsigned int uint;
void swap(uint *a, uint *b)
{
if (*a == *b) {
return;
}
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
int partition(uint *v, uint lower, uint upper)
{
uint pivotIndex = lower + rand() % (upper - lower + 1);
swap(&v[pivotIndex], &v[upper]);
uint pivot = v[upper];
uint i = lower;
for (uint j = lower; j < upper; j++) {
if (v[j] <= pivot) {
swap(&v[j], &v[i++]);
}
}
swap(&v[i], &v[upper]);
return i;
}
uint find_kth_min(uint *v, uint lower, uint upper, uint k)
{
uint p;
do {
p = partition(v, lower, upper);
if (p < k) {
lower = p + 1;
} else {
upper = p - 1;
}
} while (lower < upper);
return v[k];
}
int main(void)
{
srand(time(NULL));
std::ifstream f("sdo.in");
std::ofstream g("sdo.out");
uint n, k;
f >> n >> k;
uint *v = new uint[n];
for (uint i = 0; i < n; i++) {
f >> v[i];
}
g << find_kth_min(v, 0, n - 1, k - 1) << '\n';
delete[] v;
f.close();
g.close();
}