Cod sursa(job #1007739)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 9 octombrie 2013 17:43:02
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <climits>
#include <vector>
#include <algorithm>

using namespace std;

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

const int N = 3000000;

int v[N];

/* Find sqrt in logarithmic time */
int sqrt(int x) {
	
	int step, i;

	for (step = 1; step < x; step <<= 1);

	for (i = 0; step; step >>= 1) {
		if ( (double)(i + step) * (double)(i + step) <= x) 
			i += step;
	}

	return i;

}

int solve(int *v, int k, int n) {
	int sq = sqrt(n) > 1024 ? 1024 : sqrt(n) ;

	vector<int> bucket[sq+1];

	/* First off we compute the minimum and the maximum element */

	int min = 0, max = 1000000;

	int bucket_range;

	int index = 0;

	while (index < k) {

		if (min == max) {
			return v[0];
		}

		bucket_range = (max - min) / sq;

		for (int i = 0; i < n; ++ i) {
			bucket[ (v[i] - min) / bucket_range ].push_back(v[i]);
		}

		for (int i = 0; i <= sq; ++i) {
			int aux = (bucket[i].size()) ;
			if (index + aux < k) {
				index += aux;
			} else {
				n = aux;
				memcpy(v ,bucket[i].data(), n * sizeof(int));
				min = min + i * bucket_range;
				max = min + bucket_range -1;
				break;
			}
		}

		sq = sqrt(n) > 1024 ? 1024 : sqrt(n);

		for (int i = 0; i <=sq; ++i) {
			bucket[i].clear();
			bucket[i].reserve(sq);
		}

	}

	return -1;

}

int main() {
	int n, k;

	in>>n>>k;

	for (int i = 0; i < n; ++i) {
		in>>v[i];
	}

	out<<solve(v, k, n)<< "\n";

	return 0;
}