Cod sursa(job #1007822)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 9 octombrie 2013 19:45:32
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
 
using namespace std;
 
ifstream in("sdo.in");
ofstream out("sdo.out");
 
const int N = 3000000;
 
int v[N];

/* Find buckets_no in logarithmic time */
int buckets_no(int x) {

    static 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 = buckets_no(n) , min = 0, max = INT_MAX, index = k, i, j , aux;
    int *frecv = new int[sq+1]; 
 
    while (index) {

        if (min == max) {
            return v[0];
        }
 
        memset(frecv, 0, (sq+1) * sizeof(int));

        int bucket_range = (max - min) / sq;
 
        for (i = 0; i < n; ++ i) {
            frecv[ (v[i] - min) / bucket_range ]++;
        }
 
        for (i = 0; i <= sq; ++i) {
            if (index - frecv[i] > 0) {
                index -= frecv[i];
            } else {
                min = min + i * bucket_range;
                max = min + bucket_range -1;
                for ( j = 0, aux = 0; j < n ; ++j) {
                    if (v[j] >= min && v[j] <= max ){
                        v[aux++] = v[j];
                    }
                }
                n = frecv[i];
                break;
            }
        }
        sq = buckets_no(n);
    }
 
    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;
}