Cod sursa(job #803433)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 27 octombrie 2012 16:12:26
Problema Statistici de ordine Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

int n, k;
int a[3000001];

void schimba(int i, int j)
{
	a[i] ^= a[j];
	a[j] ^= a[i];
	a[i] ^= a[j];
}


int partitioneaza(int stanga, int dreapta)
{
	int i, j, pivot;
	i = stanga - 1;
	j = dreapta + 1;	

	pivot = stanga + (rand() % (dreapta - stanga));
	schimba(stanga, pivot);
	pivot = a[stanga];

	while (i < j)
	{
		while (a[++i] < pivot)
			if (i >= j)	break;

		while (a[--j] > pivot);

		if ( i < j)
			schimba(i, j);
	}
	
	schimba(stanga, j);
	return j;
}


int sdo(int k)
{
	int i  = 	0; 
	int j =	n - 1;
	int p;

 	while (i < j)
	{
		p = partitioneaza(i, j);
		if 		(k < p)		j = p - 1;
		else if	(k > p)		i = p + 1;
		else				return a[k];				
	}

	return a[k];
}
			
int main(void)
{
	int i;
	FILE * in 	= 	fopen("sdo.in", "r");
	FILE * out 	= 	fopen("sdo.out", "w");

	fscanf(in, "%d %d", &n, &k);
	for (i = 0; i < n; ++i)
		fscanf(in, "%d", &a[i]);


	fprintf(out, "%d\n", sdo(k-1));	

	fclose(out);
	fclose(in);
	return 0;
}