Pagini recente » Cod sursa (job #1158159) | Borderou de evaluare (job #365148) | Cod sursa (job #884269)
Cod sursa(job #884269)
#include <vector>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
vector<int> v;
inline int medianOfThree(int left, int middle, int right)
{
if(v[left] < v[middle])
{
if(v[middle] < v[right]) return middle;
else if(v[left] < v[right]) return right;
else return left;
}
else {
if(v[middle] > v[right]) return middle;
else if(v[right] < v[left]) return right;
else return left;
}
}
inline void _swap(int& x, int& y) {int aux = x; x = y; y = aux;}
int QuickSelect(int left, int right, const int& idx)
{
if(left > right) exit(1);
if(left == right) return v[left];
int pValue, pIndex, i, j;
_swap(v[left], v[rand() % (right - left + 1) + left]);
pValue = v[pIndex = medianOfThree(left, (left + right) >> 1, right)];
_swap(v[left], v[pIndex]);
for(i = left, j = right + 1; true;)
{
while(v[--j] > pValue);
while(i <= right && v[++i] < pValue);
if(i >= j) break;
_swap(v[i], v[j]);
}
_swap(v[left], v[j]);
if(idx == j) return pValue;
if(j > idx) return QuickSelect(left, j - 1, idx);
return QuickSelect(j + 1, right, idx - j);
}
int main()
{
int N, idx;
ifstream in("sdo.in");
ofstream out("sdo.out");
in >> N >> idx;
copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v));
out << QuickSelect(0, v.size() - 1, idx - 1) << '\n';
in.close();
out.close();
return EXIT_SUCCESS;
}