Mai intai trebuie sa te autentifici.
Cod sursa(job #1684444)
Utilizator | Data | 11 aprilie 2016 01:28:08 | |
---|---|---|---|
Problema | Statistici de ordine | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.39 kb |
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#ifdef INFOARENA
#define ProblemName "sdo"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
#define MAXN 500010
int v[MAXN];
int partition(int left, int right) {
//int pivot = left + fastrand() % (right - left);
int pivot = (left + right) >> 1;
swap(v[pivot], v[right - 1]);
pivot = v[right - 1];
int lindex = left, rindex = right - 2;
while (lindex <= rindex) {
while (v[lindex] < pivot && lindex < right) ++lindex;
while (v[rindex] > pivot && rindex >= left) --rindex;
if (lindex <= rindex) {
swap(v[rindex], v[lindex]);
++lindex, --rindex;
}
}
swap(v[lindex], v[right - 1]);
return lindex;
}
int K;
int quickFind(int left, int right) {
if (left == right - 1) return v[K];
int p = partition(left, right);
if (p == K) return v[K];
if (K < p) return quickFind(left, p);
return quickFind(p, right);
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
int N;
scanf("%d%d", &N, &K);
--K;
for (int i = 0; i < N; i++)
scanf("%d", &v[i]);
printf("%d\n", quickFind(0, N));
return 0;
}