Cod sursa(job #381473)

Utilizator ConsstantinTabacu Raul Consstantin Data 10 ianuarie 2010 18:41:01
Problema Statistici de ordine Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

int v[3000010],i,p,u,k,n,m;


int part(int k,int li,int lf,int a[]){
int i = li+1,j = lf,p = li + rand()%(lf - li + 1);

swap(a[li],a[p]);
p = a[li];

while( i < j){
while(a[i] <=  p && i < j) i++;
while(a[j] > p   && i < j) j--;
if(i < j)swap(v[i],v[j]);
}
swap(a[li],a[j-1]);
if(j -1== k)return v[k];
else
if(j-1<k) return part(k,j,lf,a);
return part(k,li,j-1,a);


}

/*int part(int A[], int li, int lf)
{
    int i = li-1, j = lf+1, p = A[li + (rand()%(lf-li+1))];
 
    while(1)
    {
        do
        {
            ++i;
        } while(A[i] < p);
 
        do
        {
            --j;
        } while(p < A[j]);
        if(i < j)
            swap(A[i], A[j]);
        else
            return j;
    }
 
    return 0;
}
*/

/*int part(int a[],int li,int lf){
int i = li,j = lf,s = 1,d = 0,p = li + (rand()%(lf-li+1));
swap(a[p],a[j]);

int aux;
while(i < j)
	{if(a[i] > a[j])
		{swap(a[i],a[j]);
		aux = -s;
		s = -d;
		d = aux;
		}
	i+=s;
	j+=d;
	}
return i;
}*/

int main(){
freopen("sdo.in","r",stdin);
freopen("sdo.out","w",stdout);

scanf("%d %d",&n,&k);

for(i = 1; i <= n ; i++)
	scanf("%d",&v[i]);

srand(time(0));

printf("%d",part(k,1,n,v));

/*sort(v+1,v+1+n);
printf("%d",v[k]);
*/
return 0;}