Cod sursa(job #3295989)

Utilizator eusebiuuRimboi Eusebiu eusebiuu Data 10 mai 2025 14:03:04
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define ll long long
#define ii pair<int, int>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");

int generate_random(int start, int end) {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(start, end);
    return dis(gen);
}

int get_pivot_position(vector<int> &a, int l, int r) {
    int pivot = generate_random(l, r);
    swap(a[pivot], a[r]);
    int idx = l;
    for (int i = l; i < r; ++i) {
        if (a[i] < a[r]) {
            swap(a[i], a[idx]);
            idx++;
        }
    }
    swap(a[r], a[idx]);
    return idx;
}

int get_i_smallest(vector<int> &a, int l, int r, int i) {
    if (l >= r) {
        return a[l];
    }
    int pivot_pos = get_pivot_position(a, l, r);
    int local_ord = pivot_pos - l + 1;
    if (local_ord == i) {
        return a[pivot_pos];
    } else if (local_ord < i) {
        return get_i_smallest(a, pivot_pos + 1, r, i - local_ord);
    }
    return get_i_smallest(a, l, pivot_pos - 1, i);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n, k;
    fin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i) {
        fin >> a[i];
    }
    fout << get_i_smallest(a, 1, n, k) << '\n';
    return 0;
}