Cod sursa(job #3349715)

Utilizator GabrielaTudoracheTudorache Gabriela GabrielaTudorache Data 1 aprilie 2026 22:45:08
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
// https://www.infoarena.ro/job_detail/3345608
#include <bits/stdc++.h>
#include <random>

using namespace std;

// reference: https://www.geeksforgeeks.org/dsa/quickselect-algorithm/

int partition(int a[], int l, int r) {
    static std::mt19937 rng(std::random_device{}());
    int pivotIndex = std::uniform_int_distribution<int>(l, r)(rng);
    swap(a[pivotIndex], a[r]);
    int pivot = a[r], i = l;
    for (int j=l;j<r;j++) {
        if (a[j]<=pivot) {
            swap(a[i],a[j]);
            i++;
        }
    }
    swap(a[i],a[r]);
    return i;
}

// complexitate timp: O(n) caz mediu, O(n^2) cel mai rau caz
// complexitate spatiu: O(log n) pentru stiva de recursie
int kth_smallest(int a[], int l, int r, int k) {
    if (k>0&&k<=r-l+1) {
        int idx=partition(a,l,r);
        if (idx-l==k-1) {
            return a[idx];
        }else if (idx-l>k-1) {
            return kth_smallest(a,l,idx-1,k);
        }else {
            return kth_smallest(a,idx+1,r,k-idx+l-1);
        }
    }
    return INT_MAX;
}

int main() {
    ifstream cin("sdo.in");
    ofstream cout("sdo.out");

    int n,k;
    cin>>n>>k;
    vector<int> a(n);
    for (int i=0;i<n;i++) {
        cin>>a[i];
    }
    cout<<kth_smallest(a.data(),0,n-1,k);
}