Cod sursa(job #3345608)

Utilizator GabrielaTudoracheTudorache Gabriela GabrielaTudorache Data 10 martie 2026 12:19:07
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

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

int partition(int a[], int l, int r) {
    swap(a[l+rand()%(r-l+1)],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);
}