Pagini recente » Cod sursa (job #199442) | Cod sursa (job #2677880) | Cod sursa (job #1065407) | Cod sursa (job #1453983) | Cod sursa (job #2291466)
#include <fstream>
#include <random>
using namespace std;
int n, v[3000005];
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int alegere_pivot(int st, int dr) {
int random = st + rand() % (dr - st);
//cout << random << " ";
return random;
}
int partitie (int st, int dr) {
//cout << v[dr] << ": ";
int pivot = v[dr];
int i = st, j = dr - 1;
while (i <= j) {
if (v[i] >= pivot && v[j] < pivot) swap(v[i], v[j]);
if (v[i] < pivot) i++;
if (v[j] >= pivot) j--;
}
swap(v[i], v[dr]);
//for (int i = 0; i < n; ++i) cout << v[i] << " ";
//cout << "\n";
return i;
}
int quickselect(int st, int dr, int k) {
if (st >= dr) return st;
int pivot = alegere_pivot(st, dr);
swap(v[pivot], v[dr]);
int ret = partitie(st, dr);
if (ret > k) return quickselect(st, ret - 1, k);
if (ret < k) return quickselect(ret + 1, dr, k);
return ret;
}
int main()
{
int n, poz;
fin >> n >> poz;
poz--;
for (int i = 0; i < n; ++i) {
fin >> v[i];
}
quickselect(0, n - 1, poz);
fout << v[poz];
return 0;
}