Pagini recente » Cod sursa (job #483218) | Cod sursa (job #1337227) | Cod sursa (job #2670638) | Cod sursa (job #574658) | Cod sursa (job #668019)
Cod sursa(job #668019)
#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;
}