Cod sursa(job #986845)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 19 august 2013 16:36:56
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#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;
}