Cod sursa(job #1126337)

Utilizator vlad_popaVlad Popa vlad_popa Data 26 februarie 2014 22:43:35
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("sdo.in");
ofstream fout ("sdo.out");

#define MAXN 3000010

int N, K;
int elements[MAXN];

int sodPartition(int left, int right) {
    int i = left - 1, j = right + 1;
    int p = elements[left];
    
    while (true) {
        do {
             ++ i;
        } while(elements[i] < p);
        do {
             -- j;
        } while(elements[j] > p);
        fout << i << " " << j << "\n";
        if (i < j)
            swap (elements[i], elements[j]);
        else {
            return i;
        } 
    }
    
    return 0;
}

int sod (int K, int left, int right) {  
    if (left == right)
        return elements[K];  
    int p = sodPartition(left, right);
    fout << p << " " << elements[p] << " " << left << " " << right << "\n";
    for (int i = 1; i <= N; ++ i) fout << elements[i] << " ";
    fout << "\n";

    if (p < K) return sod(K, p + 1, right);
    else if (p >= K) return sod(K, left, p);
    else return elements[K];
}

int main () {
    fin >> N >> K;
    for (int i = 1; i <= N; ++ i) {
        fin >> elements[i];
    }
    nth_element(elements + 1, elements + K, elements + N + 1);
    fout << elements[K] << "\n";
    
    return 0;
}