Pagini recente » Cod sursa (job #8534) | Cod sursa (job #941111) | Cod sursa (job #1733107) | Cod sursa (job #894844) | Cod sursa (job #2060862)
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int v[3000001];
/*int part ( int s, int d )
{
int i, j;
i = s-1;
j= d+1;
int randpoz, r1, r2, r3;
int nr = d-s+1;
r1 = rand() % nr + s;
r2 = rand() % nr + s;
r3 = rand() % nr + s;
int minr, maxr;
minr = min ( min(r1, r2), min(r2, r3) );
maxr = max ( max(r1, r2), max(r2, r3) );
randpoz = r1+r2+r3 - minr-maxr;
int pivot = v[randpoz];
while (true){
do
{
++i;
}while( v[i] < pivot);
do
{
--j;
}while( v[j] > pivot);
if( i>=j )
return j;
swap(v[i], v[j]);
}
}*/
int part(int p, int r)
{
int x = v[r];
int i = p-1;
for(int j=p; j<r; j++)
if(v[j] <= x){
i++;
swap(v[i], v[j]);
}
swap(v[i+1], v[r]);
return i+1;
}
int rand_part(int p, int r)
{
int i = rand()% (r-p+1) + p;
swap (v[r], v[i]);
return part(p, r);
}
int rand_select(int p, int r, int i)
{
if ( p == r )
return v[p];
int q = rand_part(p, r);
int k = q - p + 1;
if ( i == k )
return v[q];
else
if ( i < k )
return rand_select(p, q-1, i);
else
return rand_select(q+1, r, i-k);
}
int main()
{
int n, k, i;
fin>>n>>k;
for(i=1; i<=n; i++)
fin>>v[i];
fin.close();
fout<<rand_select(1, n, k);
fout.close();
return 0;
}