Cod sursa(job #1007741)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 9 octombrie 2013 17:45:10
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 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 || I==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;
}