Pagini recente » Borderou de evaluare (job #3331231) | Cod sursa (job #3328440) | Cod sursa (job #3327007) | Cod sursa (job #3302182) | Cod sursa (job #3344943)
#include <bits/stdc++.h>
std::ifstream fin("sdo.in");
std::ofstream fout("sdo.out");
int aranjare(std::vector<int>& a, int st, int dr)
{
int poz_random = st + rand() % (dr - st + 1);
std::swap(a[poz_random], a[dr]);
int pivot = a[dr];
int i = st;
for (int j = st; j < dr; j++)
if (a[j] <= pivot)
{
std::swap(a[i], a[j]);
i++;
}
std::swap(a[i], a[dr]);
return i;
}
int quickSelect(std::vector<int>& a, int st, int dr, int k)
{
while (st <= dr)
{
int p = aranjare(a, st, dr);
if (p == k) return a[p];
else if (p < k) st = p + 1;
else dr = p - 1;
}
return -1;
}
int main()
{
std::ios_base::sync_with_stdio(0);
fin.tie(0);
int n, k, i, x;
std::vector<int> a;
fin >> n >> k;
for(i=0; i<n; i++)
{
fin >> x;
a.push_back(x);
}
fout << quickSelect(a, 0, n-1, k-1);
fin.close();
fout.close();
return 0;
}