Cod sursa(job #1581941)

Utilizator somuBanil Ardej somu Data 27 ianuarie 2016 13:35:16
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

#define nmax 3000001

ifstream fi("sdo.in");
ofstream fo("sdo.out");

int n, k;
int A[nmax];

int qs(int st, int dr)
{

	int i = st;
	int j = dr;
	int pivot = A[i + rand() % (j - i + 1)];

	while (1)
	{

		for (; A[i] < pivot;) i++;
		for (; A[j] > pivot;) j--;

		if (i <= j)
			swap(A[i++], A[j--]);
		else
			return j;
	}

	return 0;

}

void solve(int st, int dr, int k)
{

	if (st == dr)
		return;

	int positionInCurrentInterval = qs(st, dr);
	int lengthOfCurrentInterval = positionInCurrentInterval - st + 1;

	if (lengthOfCurrentInterval >= k)
		solve(st, positionInCurrentInterval, k);
	else
		solve(positionInCurrentInterval + 1, dr, k - lengthOfCurrentInterval);

}

int main()
{

	srand(time(0));

	fi >> n >> k;

	for (int i = 1; i <= n; i++)
		fi >> A[i];

	solve(1, n, k);

	fo << A[k] << "\n";

	fi.close();
	fo.close();

	return 0;
}