Cod sursa(job #1430809)

Utilizator GilgodRobert B Gilgod Data 8 mai 2015 20:46:39
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <ctime>

#define NMAX 3000000

const char IN[] = "sdo.in", OUT[] = "sdo.out";

using namespace std;

int v[NMAX];
int N, K;

inline void swap(int poz1, int poz2) {
	if (&v[poz1] != &v[poz2]) {
		v[poz1] = v[poz1] ^ v[poz2];
		v[poz2] = v[poz2] ^ v[poz1];
		v[poz1] = v[poz1] ^ v[poz2];
	}
}

inline void readData() {
	freopen(IN, "r", stdin);
	scanf("%d %d", &N, &K);
	for (int i = 0; i < N; ++i) scanf(" %d", &v[i]);
	fclose(stdin);
}

inline int partition(int low, int high, int pivot) {
	int pivotval = v[pivot];
	swap(pivot, high);
	int index = low;
	for (int i = low; i < high; ++i) {
		if (v[i] < pivotval) swap(i, index), ++index;
	}
	swap(high, index);
	return index;
}

int find_kth(int low, int high) {
	if (low > high) return -1;
	int m = low + rand() % ((high==low)?1:(high-low));
	int index = partition(low, high, m);
	if (index == K - 1) return v[index];
	if (index < K) return find_kth(index + 1, high);
	return find_kth(low, index - 1);
}

int main() {
	readData();
	srand(time(NULL));
	freopen(OUT, "w", stdout);
	cout << find_kth(0, N - 1);
	fclose(stdout);
	return 0;
}