Cod sursa(job #1539214)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 30 noiembrie 2015 15:01:40
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int maxn = 3000005;

int a[maxn];

int partition(int *a, int st, int dr, int pivot) {
	swap(a[pivot], a[dr]);
	int l = st;
	for(int i = st ; i < dr ; ++ i)
		if(a[i] <= a[dr])
			swap(a[l ++], a[i]);
	swap(a[l], a[dr]);
	return l;
}

int nthElement(int *a, int st, int dr, int k) {
//	if(st > dr)
//		return  -1;
	if(st == dr)
		return a[st];
	int pivot = rand() % (dr - st + 1) + st;
	int ind = partition(a, st, dr, pivot);
	if(ind == k)
		return a[ind];
	if(k < ind)
		return nthElement(a, st, ind - 1, k);
	else
		return nthElement(a, ind + 1, dr, k - ind);
}


int main() {
	ifstream fin("sdo.in");
	ofstream fout("sdo.out");

	srand(time(NULL));

	int n, k;
	fin >> n >> k;
	for(int i = 0 ; i < n ; ++ i)
		fin >> a[i];
	fout << nthElement(a, 0, n - 1, k - 1) << ' ';
}