Pagini recente » Cod sursa (job #996048) | Cod sursa (job #8927) | Cod sursa (job #1785067) | Cod sursa (job #490244) | Cod sursa (job #1625688)
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <vector>
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(std::vector<uint> &v, uint li, uint lf)
{
int i = li - 1, j = lf + 1, p = v[li + (rand() % (lf - li + 1))];
while (1) {
do {
++i;
} while (v[i] < p);
do {
--j;
} while (p < v[j]);
if (i < j)
swap(&v[i], &v[j]);
else
return j;
}
return 0;
}
uint find_kth_min(std::vector<uint> &v, uint lower, uint upper, uint k)
{
uint p;
do {
p = partition(v, lower, upper);
if (p == k)
break;
if (p < k) {
lower = p + 1;
} else {
upper = p - 1;
}
} while (lower < upper);
return v[k];
}
int main(void)
{
std::ifstream f("sdo.in");
std::ofstream g("sdo.out");
uint n, k;
f >> n >> k;
std::vector<uint> v(n);
for (uint i = 0; i<n; f>> v[i++]) {
}
g << find_kth_min(v, 0, v.size() - 1, k - 1) << '\n';
f.close();
g.close();
}