Pagini recente » Cod sursa (job #3241265) | Cod sursa (job #2486815) | Cod sursa (job #1413378) | Cod sursa (job #775122) | Cod sursa (job #1313293)
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
long i,n,k,j,pozitie,v[3000000];
long part(long s, long d)
{
i=s-1; j=d+1;
long pivot=v[s+rand()%(d-s+1)]; //pivot aleator
while(i<j)
{
while(pivot>v[i])
i++;
while(pivot<v[j])
j--;
if(i<j)
{ swap(v[i],v[j]); i++; j--; }
}
return i;
}
void sord(long v[], long s, long d, long k)
{
if(s==d)
{pozitie=k; return;}
long poz=part(s,d); //da pozitia pivotului aleator
long t=poz-s+1; //elemente intre capatul din stanga al intervalului si pozitia pivotului (incluzand pivotul)
if(t>k) //elementul cautat se afla in subvectorul din stanga
sord(v,s,poz,k);
else if (t>k)//elementul cautat se afla in subvectorul din dreapta
sord(v,poz,d,k-t); //din k scad cate elemente sunt in stanga
else
{pozitie=poz+1; return;}
}
int main()
{
f>>n>>k;
for(i=1;i<=n;i++)
f>>v[i];
sord(v,1,n,k);
g<<v[pozitie];
return 0;
}