Cod sursa(job #668019)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 24 ianuarie 2012 09:41:31
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

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

const int N=1750;

int v[3000001],frecv[N];

int maxim=0,minim=1000000001;

int n,I,k,rep;

void solve(){
	int i;
	if(rep!=0){ // daca e prima oara cand functia e apelata am deja calculat maxim si minim din citire
		maxim=0;
		minim=1000000001;
		memset((void*)&frecv, 0, sizeof(int)*N); // restez altfel vectorul de frecvente la 0 si calculez maxim si minim din vecotrul ramas
		for(i=1;i<=n;++i){
			if(v[i]>maxim)
				maxim=v[i];
			if(v[i]<minim)
				minim=v[i];
		}
	}
	rep++; // stiu la a cat-a repetare am ajuns
	I=(maxim-minim+1)/N+1; // calculez un impartitor astfel incat sa distribui cat mai uniform valoarea frecventelor
	for(i=1;i<=n;++i){ //calculez dimensiunea fiecarui bucket
		frecv[(v[i]-minim+1)/I]++;
	}
	int frecvtotal=0;
	int poz=0;
	for(i=0;i<=N;++i){ // gasesc bucketul in care se afla valoarea cautata
		if(!frecv[i])
			continue;
		frecvtotal+=frecv[i];
		if(frecvtotal>=k){
			poz=i;
			frecvtotal-=frecv[i];
			break;
		}
	}
	k-=frecvtotal;
	int aux=0;
	for(i=1;i<=n;++i){  // mut toate valorile din bucketul unde se afla valoarea cautata la inceputul vectorului 
		if((v[i]-minim+1)/I==poz){
			v[++aux]=v[i];
		}
	}
	n=aux;
	if(aux==1){
		out<<v[1];
		return;
	}
	solve();
}

int main(){
	int i;
	in>>n>>k;
	for(i=1;i<=n;++i){
		in>>v[i];
		if(v[i]>maxim)
			maxim=v[i];
		if(v[i]<minim)
			minim=v[i];
	}
	solve();
	return 0;
}