Pagini recente » Cod sursa (job #3224162) | Cod sursa (job #1380569) | Cod sursa (job #1779040) | Cod sursa (job #1933705) | Cod sursa (job #1329932)
/*
* =====================================================================================
*
* Filename: order_statistics.cpp
*
* Description:
*
* Version: 1.0
* Created: 01/30/2015 00:11:53
* Revision: none
* Compiler: gcc/g++
*
* Author: Marius-Constantin Melemciuc
* email:
* Organization:
*
* =====================================================================================
*/
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <fstream>
using namespace std;
void swap(int& a, int& b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int partition(vector<int>& array, int left, int right)
{
int x = array[right];
int i = left - 1;
for (int j = left; j < right; j++)
if (array[j] <= x)
{
i++;
swap(array[i], array[j]);
}
swap(array[i + 1], array[right]);
return i + 1;
}
int randomizedPartition(vector<int>& array, int left, int right)
{
int random = left + (rand() % (right - left));
swap(array[right], array[random]);
return partition(array, left, right);
}
int orderStatistics(vector<int>& array, int left, int right, int i)
{
if (left == right)
return array[left];
int pivot = randomizedPartition(array, left, right);
int k = pivot - left + 1;
if (k == i)
return array[pivot];
if (i < k)
return orderStatistics(array, left, pivot - 1, i);
else
return orderStatistics(array, pivot + 1, right, i - k);
}
int main(int argc, char** argv)
{
ifstream input("sdo.in");
ofstream output("sdo.out");
int n, x;
vector<int> array;
input >> n >> x;
for (int i = 0; i < n; i++)
{
int z;
input >> z;
array.push_back(z);
}
output << orderStatistics(array, 0, array.size() - 1, x);
output << '\n';
return 0;
}