Cod sursa(job #677219)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 9 februarie 2012 22:13:53
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int a[3000000];

int randomized_partition(int i1, int i2)
{
	//srand(time(NULL));
	//int poz = i1 + rand() % (i2 - i1 + 1);
	int poz = i1;

	int aux = a[i1];
	a[i1] = a[poz];
	a[poz] = aux;

	int i = i1 - 1, j = i2 + 1;
	int x = a[i1];
	while (true) {
		do {
			if (j == i1)
				break;
			j--;
		} while (a[j] > x);

		do {
			if (i == i2)
				break;
			i++;
		} while (a[i] < x);

		if (i < j) {
			aux = a[i];
			a[i] = a[j];
			a[j] = aux;
		} else
			return j;
	}
}

int find_k(int i1, int i2, int k)
{
	if (i1 == i2)
		return a[i1];

	int x = randomized_partition(i1, i2);
	int dim = x - i1 + 1;

	if (k <= dim)
		return find_k(i1, x, k);
	else
		return find_k(x + 1, i2, k - dim);
}

int main()
{
	int n, k;

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

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

	for (int i = 0; i < n; i++) 
		scanf("%d ", &a[i]);

	printf("%d\n", find_k(0, n - 1, k));

	return 0;
}