Cod sursa(job #1539246)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 30 noiembrie 2015 16:03:09
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 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;
}

void print(int *a, int st, int dr) {
	for(int i = st ; i <= dr ; ++ i)	
		cout << a[i] << ' ';
	cout << '\n';
}

int nthElement(int *a, int n, int k) {
	int ind = 0;
	swap(a[rand() % n], a[n - 1]);
	for(int i = 0 ; i < n - 1 ; ++ i)
		if(a[i] <= a[n - 1])
			swap(a[i], a[ind ++]);
	swap(a[ind], a[n - 1]);
	if(ind == k)
		return a[ind];
	else if(k < ind)
		return nthElement(a, ind, k);
	else
		return nthElement(a + ind, n - ind, 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, n, k - 1);
}