Mai intai trebuie sa te autentifici.
Cod sursa(job #2273262)
Utilizator | Data | 31 octombrie 2018 11:06:33 | |
---|---|---|---|
Problema | Statistici de ordine | Scor | 10 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
/**
* Worg
*/
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
FILE *fin = freopen("sdo.in", "r", stdin); FILE *fout = freopen("sdo.out", "w", stdout);
int KthElement(std::vector<int > &v, int left, int right, int k) {
//printf("Cautam in intervalul [%d, %d] elementul %d\n", left, right, k);
if(right <= left) {
return v[left];
}
int pivot = v[left + rand() % (right - left + 1)];
int a = left, b = right;
while (a < b) {
while (a < b && v[a] < pivot) {
a++;
}
while (a < b && v[b] > pivot) {
b--;
}
if (a < b) {
std::swap(v[a], v[b]);
a++; b--;
}
}
int count_lower = 0;
for (int i = left; i <= right && v[i] < pivot; i++) {
count_lower++;
}
/*
printf("Pivot: %d\n", pivot);
for(int i = left; i <= right; i++) {
printf("%d ", v[i]);
}
printf("\n%d\n", count_lower);
*/
//return 0;
if(k <= count_lower) {
//printf("*");
KthElement(v, left, left + count_lower - 1, k);
} else {
KthElement(v, left + count_lower, right, k - count_lower);
}
}
int main() {
int n, k;
std::vector<int > v;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
int x; scanf("%d", &x);
v.push_back(x);
}
printf("%d\n", KthElement(v, 0, n - 1, k));
return 0;
}