Pagini recente » Cod sursa (job #2074131) | Cod sursa (job #1906576) | Cod sursa (job #2048360) | Cod sursa (job #1543607) | Cod sursa (job #986845)
Cod sursa(job #986845)
#include <fstream>
#include <stdlib.h>
using namespace std;
const int nmax = 3000100;
int A[nmax], K, N;
pair <int, int> partition(int left, int right) {
int pivot = A[rand() % (right - left) + left];
//I = A[left..l) < A[l..k) = pivot < A[r..right)
int l = left, k = l, r = right;
while(k < r) {
if(A[k] < pivot)
swap(A[k++], A[l++]);
else if(A[k] > pivot)
swap(A[k], A[--r]);
else k++;
}
return make_pair(l, r);
}
void nth(int left, int right) {
if(left < right) {
pair <int, int> part = partition(left, right);
if(K < part.first) nth(left, part.first);
else if ( K > part.second) nth(part.second, right);
}
}
int main() {
ifstream in ("sdo.in");
ofstream out ("sdo.out");
in >> N >> K;
for(int i = 1; i <= N; i++)
in >> A[i];
nth(1, N + 1);
out << A[K];
return 0;
}