Cod sursa(job #2225478)

Utilizator AraldaAralda Pacurar Aralda Data 27 iulie 2018 12:42:12
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctime>

int sir[3000001];

int part(int stg, int dr) {

	int pivot = sir[stg];
	int i = stg - 1;
	int j = dr + 1;

	while (1) {

		do {

			j--;

		} while (sir[j] > pivot);

		do {

			i++;

		} while (sir[i] < pivot);

		if (i < j) {

			int aux = sir[i];
			sir[i] = sir[j];
			sir[j] = aux;
		}
		else {

			return j;
		}
	}
}

int random_part(int stg, int dr) {

	int r = rand() % (dr - stg) + stg + 1;

	int aux = sir[stg];
	sir[stg] = sir[r];
	sir[r] = aux;

	return part(stg, dr);
}

int quick_select(int stg, int dr, int k) {

	if (stg == dr) {

		return sir[stg];
	}

	int index = random_part(stg, dr);
	int len = index - stg + 1;

	if (k <= len) {

		return quick_select(stg, index, k);
	}
	else {

		return quick_select(index + 1, dr, k - len);
	}

}

int main() {

	FILE* ip;
	FILE* op;

	ip = fopen("sdo.in", "r");
	if (ip == NULL) {

		perror("Error opening input file");
		return 1;
	}

	op = fopen("sdo.out", "w");
	if (op == NULL) {

		perror("Error opening output file");
		return 1;
	}

	srand(time(NULL));

	int n, k;
	fscanf(ip, "%d%d", &n, &k);

	for (int i = 1; i <= n; i++) {
		
		fscanf(ip, "%d", &sir[i]);
	}

	int res = quick_select(1, n, k);
	fprintf(op, "%d", res); 

	fclose(ip);
	fclose(op);

	return 0;
}