Pagini recente » Cod sursa (job #875370) | Cod sursa (job #270637) | Cod sursa (job #637212) | Istoria paginii runda/very-long_olimp | Cod sursa (job #1266850)
#include<cstdio>
#include<cstdlib>
#include<ctime>
int n,k,i,j,v[3001000],vl[3001000],vr[3001000],p,u,mid;
FILE *f,*g;
void chg(int &a,int &b){
int aux=a;
a=b;
b=aux;
}
int sdo(int l,int r){
int st,dr,i,j,p,a;
st=dr=0;
p=l+rand()%(r-l+1);
for(i=l;i<=r;i++){
if(v[i]<v[p])
vl[++st]=v[i];
else if(v[i]==v[p]){
vl[++st]=v[i];
a=st;
}
else
vr[++dr]=v[i];
}
chg(vl[a],vl[st]);
for(i=l,j=1;i<=r;i++,j++){
if(j<=st)
v[i]=vl[j];
else
v[i]=vr[j-st];
}
return l+st-1;
}
int main(){
f=fopen("sdo.in","r");
g=fopen("sdo.out","w");
srand(time(0));
fscanf(f,"%d%d",&n,&k);
for(i=1;i<=n;i++){
fscanf(f,"%d",&v[i]);
}
p=1;
u=n;
while(p<=u){
mid=sdo(p,u);
if(mid==k){
fprintf(g,"%d",v[mid]);
return 0;
}
if(mid<k)
p=mid+1;
else
u=mid-1;
}
fclose(f);
fclose(g);
return 0;
}