Pagini recente » Cod sursa (job #3329304) | Cod sursa (job #3352843) | Cod sursa (job #3040561) | Cod sursa (job #3315767) | Cod sursa (job #3352358)
#include <stdio.h>
#include <stdlib.h>
#define N 3000000
int v[N];
void amesteca(int v[], int n);
void interschimba(int *pa, int *pb);
int partitie(int v[], int st, int dr);
int main(void) {
FILE *in = fopen("sdo.in", "r");
int n, k;
fscanf(in, "%d%d", &n, &k);
k--;
for (int i = 0; i < n; i++) {
fscanf(in, "%d", &v[i]);
}
fclose(in);
amesteca(v, n);
int st = 0, dr = n - 1;
while (st < dr) {
int p = partitie(v, st, dr);
if (k < p) {
dr = p;
} else if (k > p) {
st = p + 1;
} else {
st = dr;
}
}
FILE *out = fopen("sdo.out", "w");
fprintf(out, "%d\n", v[k]);
fclose(out);
return 0;
}
void amesteca(int v[], int n) {
for (int i = n - 1; i > 0; i--) {
int j = rand() % (i + 1);
interschimba(&v[i], &v[j]);
}
}
void interschimba(int *pa, int *pb) {
int t = *pa;
*pa = *pb;
*pb = t;
}
int partitie(int v[], int st, int dr) {
int pivot = v[dr];
int i = st, poz = st;
while (i < dr) {
if (v[i] <= pivot) {
interschimba(&v[i], &v[poz++]);
}
i++;
}
interschimba(&v[poz], &v[dr]);
return poz;
}