Cod sursa(job #459109)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 27 mai 2010 20:18:27
Problema Statistici de ordine Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

#define swap(a, b) do { \
	(a) = (a) ^ (b);    \
	(b) = (b) ^ (a);    \
	(a) = (a) ^ (b);    \
} while(0)


void read_input(char * file, int ** a, int * n, int * k) {
	FILE * f;
	int i;

	f = fopen(file, "r");
	assert(f);

	fscanf(f, "%d %d", n, k);

	*a = (int *) malloc(*n * sizeof(int));

	for (i = 0; i < *n; ++i)
		fscanf(f, "%d", (*a) + i);

	fclose(f);
}

int partition(int *a, int i, int j) {
	int x;

	x = a[i];
	i--;
	j++;
	for (;;) {
		do
			i++;
		while (a[i] < x);

		do
			j--;
		while (a[j] > x);

		if (i < j)
			swap(a[i], a[j]);
		else
			return j;
	}
}

int find_kth(int *a, int i, int j, int k) {
	int q, r;

	if (i == j)
		return a[i];

	q = partition(a, i, j);
	r = q - i + 1;
	if (k <= r)
		return find_kth(a, i, q, k);
	else
		return find_kth(a, q + 1, j, k - r);
}

int main(int argc, char * argv[]) {
	int n, k;
	int * a;

//	if (argc != 2) {
//		printf("Usage:%s file_in\n", argv[0]);
//		exit(EXIT_FAILURE);
//	}

	read_input("sdo.in", &a, &n, &k);

	//printf("%dth min is %d\n", k, find_kth(a, 0, n-1, k));

	FILE * f;
	f = fopen("sdo.out", "w");
	fprintf(f, "%d", find_kth(a, 0, n-1, k));
	fclose(f);

	return 0;
}