Pagini recente » Cod sursa (job #1875600) | Cod sursa (job #1154431) | Diferente pentru utilizator/efer intre reviziile 3 si 4 | Cod sursa (job #2008768) | Cod sursa (job #2061573)
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream cin ("sdo.in");
ofstream cout("sdo.out");
const int MaxN = 3000005;
int v[MaxN];
void Partition(int v[], int pivVal, int lf, int rg) {
int lastSwapped = lf - 1;
for (int i = lf; i < rg; ++i) {
if (v[i] <= pivVal) {
++lastSwapped;
swap(v[i], v[lastSwapped]);
}
}
++lastSwapped;
swap(v[rg], v[lastSwapped]);
}
int NthElement(int v[], int findElement, int lf, int rg) {
int pivPos = lf + rand() % (rg - lf + 1);
int pivVal = v[pivPos];
// cout << pivVal << endl;
swap(v[pivPos], v[rg]);
Partition(v, pivVal, lf, rg);
// for (int i = 1; i <= n; ++i) {
// cout << v[i] << ' ';
// }
// cout << endl;
if (findElement > pivPos) {
return NthElement(v, findElement, pivPos + 1, rg);
}
else if (findElement < pivPos) {
return NthElement(v, findElement, lf, pivPos - 1);
}
return v[findElement];
}
int main() {
// int n, k;
srand(time(0));
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
cout << NthElement(v, k, 1, n) << '\n';
return 0;
}