Cod sursa(job #526690)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 29 ianuarie 2011 11:05:21
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
#define N 3000001
long n,a[N],i,k;

long partition(long a[N],long p,long r)
{long i=p-1,j,x=a[r],m;
for(j=p;j<r;j++)
if(a[j]<=x)
       {i++;
       if(i!=j)
               {m=a[i];
               a[i]=a[j];
               a[j]=m;}}
if(i+1!=r)
       {m=a[i+1];
       a[i+1]=a[r];
       a[r]=m;}
return i+1;}

long randomized_partition(long a[N],long p,long r)
{long aux;
if((p+r)%2==0)
       {aux=a[r];
       a[r]=a[p];
       a[p]=aux;}
return partition(a,p,r);}

long select(long a[N],long p,long r,long i)
{if(p==r)
        return a[p];
long q=randomized_partition(a,p,r),k;
k=q-p+1;
if(i==k)
        return a[q];
else
        if(i<k)
                 return select(a,p,q-1,i);
        else
                 return select(a,q+1,r,i-k);}

int main()
{freopen("sdo.in","r",stdin);
freopen("sdo.out","w",stdout);
scanf("%ld%ld\n",&n,&k);
for(i=1;i<=n;i++)
     scanf("%ld",&a[i]);
printf("%ld\n",select(a,1,n,k));
fclose(stdin);
fclose(stdout);
return 0;}