Cod sursa(job #616980)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 13 octombrie 2011 19:09:53
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N_MAX 3000010
int V[N_MAX];
int n, k;
inline void swap(int &x, int &y) {
	int z = x; x = y; y = z;
}
int split(int st, int dr) {
	int i = st-1, j = dr+1;
	int piv = V[rand()%(dr-st+1)+st-1];
	while(1) {
		i++;
		j--;
		while(V[i] < piv) i++;
		while(V[j] > piv) j--;
		if(i < j) swap(V[i], V[j]);
		else return j;
	}
	return 0;
} 
void sdo(int st, int dr, int k) {
	if(st >= dr) return;
	int q = split(st, dr);
//	printf("--->apel %d %d\n", st, dr);
//	printf("%d\n", q-st+1);
	if(k <= q-st+1) sdo(st, q, k);
	else sdo(q+1,dr, k - (q-st+1));
}
int main() {
	srand(time(NULL));
	freopen("sdo.in", "r", stdin);
	freopen("sdo.out", "w", stdout);
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &V[i]);
	sdo(1, n, k);
	printf("%d\n", V[k]);
	return 0;
}