Pagini recente » Cod sursa (job #676218) | Cod sursa (job #1623359) | Cod sursa (job #2910027) | Diferente pentru problema/sever intre reviziile 13 si 12 | Cod sursa (job #2061585)
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream cin ("sdo.in");
ofstream cout("sdo.out");
const int MaxN = 3000005;
int v[MaxN];
int 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]);
return lastSwapped;
}
int NthElement(int v[], int findElement, int lf, int rg) {
int pivPos = lf + rand() % (rg - lf + 1);
int pivVal = v[pivPos];
swap(v[pivPos], v[rg]);
// cout << pivVal << endl;
int finalPivPos = Partition(v, pivVal, lf, rg);
// for (int i = 1; i <= n; ++i) {
// cout << v[i] << ' ';
// }
// cout << endl;
if (findElement > finalPivPos) {
return NthElement(v, findElement, finalPivPos + 1, rg);
}
else if (findElement < finalPivPos) {
return NthElement(v, findElement, lf, finalPivPos - 1);
}
return v[findElement];
}
int main() {
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';
// cout << 300000 << ' ' << 542 << '\n';
// for (int i = 1; i <= 300000; ++i) {
// // cout << rand() % (int) 1e9 + 1 << ' ';
// cout << 300000 - i << ' ';
// }
return 0;
}