Cod sursa(job #381377)

Utilizator ConsstantinTabacu Raul Consstantin Data 10 ianuarie 2010 14:29:03
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int v[3000010],i,p,u,k,n,m;

void swap(int &a,int &b){
int aux = a;
a = b; 
b = aux;
}


int part(int v[],int li,int lf){
int s=li-1,i,p ;
if(lf- li != 1)
p = li + (rand()%(lf - (li + 1)));
else
	p = li + rand()%2;
p = v[p];

for( i = li; i <= lf ; i++)
	if(v[i] < p){
		s ++;
		if(s < i )
		swap(v[s],v[i]);
	}
return s+1;

}


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));
p = 1; u = n;
while(true){
	m = part(v,p,u);
	if(m == k){printf("%d",v[k]);return 0;}
	else
	if(m > k){u = m - 1;}
	else
	p = m + 1;
	}


return 0;}