Pagini recente » Monitorul de evaluare | Statistici Voicu Delia (04Alex) | Diferente pentru home intre reviziile 333 si 902 | Monitorul de evaluare | Cod sursa (job #2277881)
#include <fstream>
#include <cstdlib>
std::ifstream cin("sdo.in");
std::ofstream cout("sdo.out");
#define maxn 3000005
int n,k,v[maxn];
int getNumber(int,int,int);
int partitie(int,int);
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>v[i];
cout<<getNumber(k,1,n);
}
int getNumber(int k,int st, int dr){
if(st>=dr)
return v[st];
int poz=partitie(st,dr);
if(poz-st+1==k)
return v[poz];
if(poz>k)
return getNumber(k,st,poz-1);
else
return getNumber(k-poz+st-1,poz+1,dr);
}
int partitie(int st, int dr){
int pivot=st + rand()%(dr-st+1);
int i=st-1, aux;
int x=v[pivot];
v[pivot]=v[dr];
v[dr]=x;
for(int j=st;j<dr;j++)
if(v[j]<x){
++i;
aux=v[j];
v[j]=v[i];
v[i]=aux;
}
v[dr]=v[i+1];
v[i+1]=x;
return i+1;
}