Pagini recente » Cod sursa (job #580339) | Cod sursa (job #1084668) | Cod sursa (job #1014688) | Cod sursa (job #2115606) | Cod sursa (job #677221)
Cod sursa(job #677221)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int a[3000000];
int randomized_partition(int i1, int i2)
{
srand(time(NULL));
int poz = i1 + rand() % (i2 - i1 + 1);
int aux = a[i1];
a[i1] = a[poz];
a[poz] = aux;
int i = i1 - 1, j = i2 + 1;
int x = a[i1];
while (true) {
do {
if (j == i1)
break;
j--;
} while (a[j] > x);
do {
if (i == i2)
break;
i++;
} while (a[i] < x);
if (i < j) {
aux = a[i];
a[i] = a[j];
a[j] = aux;
} else
return j;
}
}
int find_k(int i1, int i2, int k)
{
if (i1 == i2)
return a[i1];
int x = randomized_partition(i1, i2);
int dim = x - i1 + 1;
if (k <= dim)
return find_k(i1, x, k);
else
return find_k(x + 1, i2, k - dim);
}
int main()
{
int n, k;
freopen("sdo.in", "r", stdin);
freopen("sdo.out", "w", stdout);
scanf("%d %d\n", &n, &k);
for (int i = 0; i < n; i++)
scanf("%d ", &a[i]);
printf("%d\n", find_k(0, n - 1, k));
return 0;
}