Cod sursa(job #484715)

Utilizator elmercerAlex Mercer elmercer Data 15 septembrie 2010 17:04:15
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long a[3000010], n, k, i;

void swap(long p1, long p2) {
	long m = a[p1];
	a[p1] = a[p2];
	a[p2] = m;
}

void rec(long in1, long in2, long nr) {
	long poz = rand() % (in2 - in1 + 1) + in1, num = 0, in4 = 0;
	
	if (in1 == in2) {
		printf("%ld", a[in1]);
		exit(0);
	}
	
	for (long i = in1; i <= in2; ++i) {
		if (a[i] < a[poz]) {
			++num;
		}
	}
	
	swap(poz, in1 + num);
	in4 = num + 2;
	
	for (long i = in1; i <= in1 + num - 1; ++i) {
		while (a[i] > a[num + 1]) {
			swap(i, in4++);
		}
	}
	
	if (num < nr)
		rec(num + 1, in2, nr - num);
	else
		rec(in1, num, nr);
	
}

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