Pagini recente » Profil Rodik_Rody | Profil Theodor1000 | Diferente pentru utilizator/bananamandaone intre reviziile 22 si 23 | Monitorul de evaluare | Cod sursa (job #854278)
Cod sursa(job #854278)
#include<stdio.h>
#define Nmax 3000001
int v[Nmax],N,K;
void read_data()
{
FILE*f = fopen("sdo.in","r");
fscanf(f,"%d%d",&N,&K);
for(int i=1;i<=N;++i)
fscanf(f,"%d",&v[i]);
fclose(f);
}
void swap(int x,int y)
{
int aux = v[x];
v[x] = v[y];
v[y] = aux;
}
int get_piv(int left,int right)
{
int piv = (left+right)/2;
swap(piv, right);
piv = right;
--left;
while(true)
{
while(v[++left] < v[piv] && left<right);
while(v[--right] > v[piv] && left<right);
if(left >= right)
break;
swap(left, right);
}
swap(piv, left);
return left;
}
int sdo(int left,int right)
{
if(left == right)
return v[left];
int piv = get_piv(left,right);
if(piv - left >= K)//nr de elem intre left, piv-1
return sdo(left,piv-1);
else
K -= (piv-left);
if(K==1)//inseamna ca e pivotul
return v[piv];
else
--K;
return sdo(piv+1,right);
}
int main()
{
read_data();
FILE*g = fopen("sdo.out","w");
fprintf(g,"%d\n",sdo(1,N));
fclose(g);
return 0;
}