Pagini recente » Istoria paginii runda/preojigim | Cod sursa (job #899429) | Cod sursa (job #2573535) | Cod sursa (job #2893333) | Cod sursa (job #2563396)
#include <bits/stdc++.h>
using namespace std;
#define zero(x) (x & (-x))
ifstream fin("sdo.in");
ofstream fout("sdo.out");
const int MAXN = 3 * 1e6 + 3;
int v[MAXN], aux[MAXN], n, ans;
int generator(int st, int dr){
return ((rand() >> 14) + rand()) % (dr - st + 1) + st;
}
void nth_elem(int st, int dr, int k){
if(dr - st <= 0 ) {
ans = (dr + st) / 2;
return;
}
int pivot = generator(st, dr), cnt = 0, l = st, copie = 0;
for(int i = st; i <= dr; ++i)
if(v[i] <= v[pivot] and i != pivot)
aux[l++] = v[i], cnt ++;
aux[l] = v[pivot];
copie = l++;
for(int i = st; i <= dr; ++i)
if(v[i] > v[pivot]) aux[l++] = v[i];
if(cnt + 1 == k){
ans = pivot;
return;
}
for(int i = st; i <= dr; ++i)
v[i] = aux[i], aux[i] = 0;
if(cnt >= k ) nth_elem(st, copie - 1, k );
else nth_elem(copie + 1, dr, k - cnt - 1);
}
int main(){
int k; fin >> n >> k;
for(int i = 1; i <= n; ++i){
fin >> v[i];
}
nth_elem(1, n, k);
fout << v[ans];
return 0;
}