Pagini recente » Cod sursa (job #1547491) | Cod sursa (job #954062) | Cod sursa (job #2422167) | Cod sursa (job #1509239) | Cod sursa (job #2948081)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX_N 3000000
int v[MAX_N];
inline bool isDigit(char c) {
return c >= '0' && c <= '9';
}
// citire numar natural
int readInt(FILE* fin) {
char ch;
int res = 0;
// eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
while (!isDigit(ch = fgetc(fin)));
// adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
do {
res = 10 * res + ch - '0';
} while (isDigit(ch = fgetc(fin)));
return res;
}
void swap(int& a, int& b) {
int aux = a;
a = b;
b = aux;
}
void qsort(int v[], int k, int begin, int end) {
int pivot = v[begin + rand() % (end - begin + 1)]; // alegem pivotul aleator
int b = begin, e = end;
while (v[b] < pivot) // cauta primul element mai mare sau egal cu pivotul
b++;
while (v[e] > pivot) // cauta primul element mai mic sau egal cu pivotul
e--;
while(b < e) { // daca indicii nu s-au atins
swap(v[b], v[e]); // interschimba pozitiile
do // cauta primul element mai mare sau egal cu pivotul
b++;
while (v[b] < pivot);
do // cauta primul element mai mic sau egal cu pivotul
e--;
while (v[e] > pivot);
}
// acum [begin..e] sunt mai mici sau egale cu pivotul
// si [e+1..end] sunt mai mari sau egale cu pivotul
if (begin < e && k <= e)
qsort(v, k, begin, e); // al k-lea element se afla in stanga
else if (e + 1 < end)
qsort(v, k, e + 1, end); // al k-lea element se afla in dreapta
}
int main() {
FILE* fin = fopen("sdo.in", "r");
FILE* fout = fopen("sdo.out", "w");
int n, k, i;
fscanf(fin, "%d%d", &n, &k);
for (i = 0; i < n; ++i)
v[i] = readInt(fin);
qsort(v, k - 1, 0, n - 1);
fprintf(fout, "%d\n", v[k - 1]);
fclose(fin);
fclose(fout);
return 0;
}