Cod sursa(job #1948298)

Utilizator tudoras8tudoras8 tudoras8 Data 31 martie 2017 22:55:39
Problema Statistici de ordine Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>


using namespace std;

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

const int MAXN = 3000001;
int n, K, v[MAXN];

int part(int li, int lf) {
    int i = li, j = lf, p = v[li + (rand() % (lf - li + 1))];
    
    while (1) {
        while (v[i] < p) {
            i++;
        }
        while (p < v[j]) {
            j--;
        }
        if (i < j) {
            swap(v[i], v[j]);
        } else {
            return j;
        }
    }
    
    return 0;
}

void sel(int li, int lf, int k) {
    if (li >= lf) {
        return;
    }
    
    int q = part(li, lf);
    int t = q - li + 1;
    
    if (t >= k) {
        sel(li, q - 1, k);
    } else {
        sel(q + 1, lf, k - t);
    }
}

int main(int argc, const char * argv[]) {
    in >> n >> K;
    for (int i = 1; i <= n; i++) {
        in >> v[i];
    }
    
    srand((int) time(NULL));
    
    sel(1, n, K);
    
    out << v[K] << '\n';
    return 0;
}