Pagini recente » Atasamentele paginii Clasament becreative27 | Atasamentele paginii Clasament problemebarajgimnaziu | Cod sursa (job #2145943) | Diferente pentru info-oltenia-2018/individual intre reviziile 10 si 9 | Cod sursa (job #1352632)
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#define nmax 3000005
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int n, k;
int A[nmax];
void read() {
fin >> n >> k;
for (int i = 1; i <= n; i++)
fin >> A[i];
}
int q(int st, int dr) {
int i = st;
int j = dr;
int pivot = A[st + rand() % (dr-st+1)];
while(1){
for (; A[i] < pivot;) i++;
for (; A[j] > pivot;) j--;
if (i <= j)
swap(A[i++], A[j--]);
else
return j;
}
return 0;
}
void solve(int st, int dr, int k) {
if (st == dr)
return;
int hi = q(st, dr);
int l = hi - st + 1;
if (l >= k)
solve(st, hi, k);
else
solve(hi+1, dr, k-l);
}
int main() {
srand(time(NULL));
read();
solve(1, n, k);
fout << A[k] << "\n";
fin.close();
fout.close();
return 0;
}