Pagini recente » Cod sursa (job #1870473) | Cod sursa (job #2251826) | Cod sursa (job #1740250) | Cod sursa (job #1745364) | Cod sursa (job #3349715)
// 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);
}