Cod sursa(job #2079856)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 1 decembrie 2017 21:37:36
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

size_t partition(vector< int >& values, size_t left, size_t right) {
    size_t pivot_position = left + rand() % (right - left + 1);
    swap(values[left], values[pivot_position]);

    for (int di = 0, dj = -1; (int)left < (int)right; left += di, right += dj) {
        if (values[left] > values[right]) {
            swap(values[left], values[right]);
            swap(di, dj);
            di *= -1; dj *= -1;
        }
    }

    return left;
}

void solve() {
    size_t size, position;
    cin >> size >> position;
    position--;

    vector< int > values(size);
    for (auto& it : values)
        cin >> it;

    size_t left = 0, right = size - 1;
    while (left <= right) {
        size_t middle = partition(values, left, right);

        if (middle == position) {
            cout << values[middle] << endl;
            return;
        }

        if (middle > position)
            right = middle - 1;
        else
            left = middle + 1;
    }

    cout << values[position] << endl;
}

int main() {
    assert(freopen("sdo.in", "r", stdin));
    assert(freopen("sdo.out", "w", stdout));
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);

    solve();

    return 0;
}