Pagini recente » Diferente pentru info-oltenia-2018/individual intre reviziile 16 si 12 | Istoria paginii runda/runda2014_14 | Istoria paginii runda/denisilie94 | Cod sursa (job #2898964) | Cod sursa (job #941187)
Cod sursa(job #941187)
#include <fstream>
#include <vector>
using namespace std;
int main()
{
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int n, k;
fin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; ++i)
fin >> a[i];
int l = 0, r = n-1;
while (true) {
swap(a[(l+r)/2],a[r]);
int pivot = a[r];
int i(l-1), j(r), p(l), q(r-1);
while (true) {
while (a[++i] < pivot);
while (a[--j] > pivot && j >= i);
if (i >= j) break;
swap(a[i],a[j]);
if (a[i] == pivot) swap(a[p++],a[i]);
if (a[j] == pivot) swap(a[q--],a[j]);
}
if (k <= i-p) {
l = p;
r = i-1;
}
else if (k > i+r-q-l) {
k -= i+r-q-l;
l = i;
r = q;
}
else {
fout << pivot;
break;
}
}
return 0;
}