Pagini recente » Cod sursa (job #2487430) | Cod sursa (job #2046113) | Cod sursa (job #243900) | Cod sursa (job #1755265) | Cod sursa (job #803433)
Cod sursa(job #803433)
#include <stdio.h>
#include <stdlib.h>
int n, k;
int a[3000001];
void schimba(int i, int j)
{
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
int partitioneaza(int stanga, int dreapta)
{
int i, j, pivot;
i = stanga - 1;
j = dreapta + 1;
pivot = stanga + (rand() % (dreapta - stanga));
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 = 0;
int j = n - 1;
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 = 0; i < n; ++i)
fscanf(in, "%d", &a[i]);
fprintf(out, "%d\n", sdo(k-1));
fclose(out);
fclose(in);
return 0;
}