Cod sursa(job #938917)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 14 aprilie 2013 14:04:58
Problema Statistici de ordine Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#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;
}