Pagini recente » Cod sursa (job #405754) | Cod sursa (job #279438) | Monitorul de evaluare | Cod sursa (job #2354366) | Cod sursa (job #1008148)
#include <cstdio>
#include <fstream>
#include <ctime>
#include <cstdlib>
#define Nmax 1000001
using namespace std;
int a[Nmax];
int n,k;
int partitioning(int left, int right)
{
int pivot = a[left + rand()%(right-left+1)];
int i = left, j = right;
while (1)
{
while (a[i] < pivot) ++i;
while (a[j] > pivot) --j;
if (i < j)
{
int aux = a[i];
a[i] = a[j];
a[j] = aux;
}
else return j;
++i;
--j;
}
return 0;
}
void select(int left, int right, int k)
{
if (left == right)
return;
int v = partitioning(left,right);
int dist = (v-left)+1;
if (k <= dist)
select(left, v, k);
else select(v+1, right, v-dist);
}
int main()
{
ifstream fin ("sdo.in");
ofstream fout ("sdo.out");
srand(time(NULL));
fin>>n>>k;
for (int i = 1; i <= n; ++i)
fin>>a[i];
select(1,n,k);
fout<<a[k]<<endl;
return 0;
}