Pagini recente » Cod sursa (job #1702842) | Cod sursa (job #2000213) | Cod sursa (job #696895) | Cod sursa (job #1580720) | Cod sursa (job #803453)
Cod sursa(job #803453)
#include <stdio.h>
#include <stdlib.h>
int n, k;
int a[3000001];
void schimba(int i, int j)
{
int aux = a[i];
a[i] = a[j];
a[j] = aux;
}
int partitioneaza(int stanga, int dreapta)
{
int i, j, pivot;
i = stanga - 1;
j = dreapta + 1;
pivot = stanga + (rand() % (dreapta - stanga) + 1);
schimba(stanga, pivot);
pivot = a[stanga];
while (i < j)
{
while (a[++i] < pivot)
if (i >= j) break;
while (a[--j] > pivot);
if (i < j)
schimba(i, j);
}
schimba(stanga, j);
return j;
}
int sdo(int k)
{
int i = 1;
int j = n;
int p;
while (i < j)
{
p = partitioneaza(i, j);
if (k < p) j = p - 1;
else if (k > p) i = p + 1;
else return a[k];
}
return a[k];
}
int main(void)
{
int i;
FILE * in = fopen("sdo.in", "r");
FILE * out = fopen("sdo.out", "w");
fscanf(in, "%d %d", &n, &k);
for (i = 1; i <= n; ++i)
fscanf(in, "%d", &a[i]);
fprintf(out, "%d\n", sdo(k));
fclose(out);
fclose(in);
return 0;
}