Cod sursa(job #2224101)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 22 iulie 2018 21:11:05
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <tuple>
#include <cstdlib>
#include <ctime>

using namespace std;

const string IN_FILE = "sdo.in";
const string OUT_FILE = "sdo.out";

inline int random(const int lower, const int upper) {
    return lower + rand() % (upper - lower + 1);
}

int partition(vector<int>& values, const int from, const int to) {
    const int pivot = values[random(from, to)];
    int i = from - 1, j = to + 1;
    while (true) {
        for (i++; values[i] < pivot; i++);
        for (j--; values[j] > pivot; j--);
        if (i >= j) return j;
        swap(values[i], values[j]);
    }
    return from;
}

int orderStatistics(
        vector<int>& values,
        const int from,
        const int to,
        const int k) {
    if (from == to) return values[from];
    const int split = partition(values, from, to);
    return k <= split - from + 1
            ? orderStatistics(values, from, split, k)
            : orderStatistics(values, split + 1, to, k - (split - from + 1));
}

int orderStatistics(vector<int>& values, const int k) {
    return orderStatistics(values, 0, int(values.size()) - 1, k);
}

pair<vector<int>, int> readInput() {
    ifstream in(IN_FILE);
    int n, k;
    in >> n >> k;
    auto values = vector<int>(n);
    for (int i = 0; i < n; i++) {
        in >> values[i];
    }
    in.close();
    return make_pair(values, k);
}

void writeOutput(const int result) {
    ofstream out(OUT_FILE);
    out << result << "\n";
    out.close();
}

int main() {
    srand(time(0));
    vector<int> values;
    int k;
    tie(values, k) = readInput();
    const int result = orderStatistics(values, k);
    writeOutput(result);
    return 0;
}