Pagini recente » Cod sursa (job #1357636) | Cod sursa (job #2245966) | Cod sursa (job #1886663) | Borderou de evaluare (job #2171036) | Cod sursa (job #573017)
Cod sursa(job #573017)
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
const int nmax = 3000010;
int N, A[nmax], K;
void read()
{
freopen ("sdo.in", "r", stdin);
freopen ("sdo.out", "w", stdout);
scanf("%d %d", &N, &K);
int i;
for(i = 1; i <= N; i++)
scanf("%d", &A[i]);
}
int part(int S, int D)
{
int p = A[rand() % (D - S + 1) + S];
int i = S - 1, j = D + 1;
while(true)
{
do{
++i;
}while(A[i] < p);
do{
j--;
}while(A[j] > p);
if(i < j)
swap(A[i], A[j]);
else return j;
}
return j;
}
void sel(int S, int D, int k)
{
if(S == D)
return;
int q = part(S, D);
int R = q - S + 1;
if(R >= k)
sel(S, q, k);
else sel(q + 1, D, k - R);
}
int main()
{
srand ( time (NULL) );
read();
sel(1, N, K);
printf("%d\n", A[K]);
return 0;
}