Pagini recente » Cod sursa (job #754312) | Cod sursa (job #696783) | Cod sursa (job #738649) | Cod sursa (job #2631652) | Cod sursa (job #374095)
Cod sursa(job #374095)
#include<stdio.h>
#define infile "sdo.in"
#define outfile "sdo.out"
#define nmax (3000*1000+1)
#define smax (1<<16)
char s[smax]; //vectorul in care parsam citirea
int v[nmax]; //vectorul cu numerele
int n; //numarul de numere
int k; //trebuie sa aflam a k-a valoare din vectorul sortat
void swap(int *a, int *b)
{
int c=*a; *a=*b; *b=c;
}
void read()
{
int i,j;
scanf("%d %d\n",&n,&k);
fread(s,1,smax,stdin);
for(i=0,j=1;j<=n;j++)
{
//sarim peste caracterele proaste
while(s[i]<'0' || s[i]>'9')
if(++i==smax)
fread(s,1,smax,stdin),i=0;
//construim numarul
while(s[i]>='0' && s[i]<='9')
{
v[j]=v[j]*10+s[i]-'0';
if(++i==smax)
fread(s,1,smax,stdin),i=0;
}
}
}
int divide(int st, int dr)
{
//alegem ca pivot o valoare random
swap(&v[st],&v[st+(rand()%(dr-st+1))]);
int x=v[st];
while(st<dr)
{
while(st<dr && v[dr]>=x) dr--;
v[st]=v[dr];
while(st<dr && v[st]<=x) st++;
v[dr]=v[st];
}
v[st]=x;
return st;
}
void sqsort(int st, int dr, int poz)
{
int mij=divide(st,dr);
int dif=mij-st+1;
if(poz<dif) sqsort(st,mij-1,poz);
else if(poz>dif) sqsort(mij+1,dr,poz-dif);
}
void write()
{
printf("%d\n",v[k]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
sqsort(1,n,k);
write();
fclose(stdin);
fclose(stdout);
return 0;
}