Pagini recente » Cod sursa (job #447646) | Cod sursa (job #425203) | Cod sursa (job #2333382) | Cod sursa (job #1015406) | Cod sursa (job #938917)
Cod sursa(job #938917)
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int A[3000100], K;
pair<int, int> partition(int l, int r){
int pivot = A[rand() % (r - l) + l];
/// I = A[l..i) < pivot and A[i..j) == pivot and A[k..r) > pivot
int i = l, j = l, k = r;
while(j < k) {
while(j < k && A[k - 1] > pivot) k--;
if(j < k) {
swap(A[j], A[k - 1]);
if(A[j] != pivot) swap(A[i++], A[j]);
j++;
}
}
return make_pair(i, j);
}
void SDO(int l, int r) {
if(l < r) {
pair<int,int> p = partition(l, r);
if(K < p.first) SDO(l, p.first);
else if(p.second < K) SDO(p.second, r);
}
}
int main()
{
ifstream in ("sdo.in");
ofstream out ("sdo.out");
int N, i;
in >> N >> K;
K--;
for(i = 0; i < N; i++) in >> A[i];
SDO(0, N);
out << A[K];
return 0;
}