Cod sursa(job #469231)

Utilizator vlad.maneaVlad Manea vlad.manea Data 6 iulie 2010 23:51:22
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <cstdlib>

int N, K, A;

void read() {

    // input file
    freopen("sdo.in", "r", stdin);

    // scan n, k
    scanf("%d%d", &N, &K);

}

void solve() {

    int V[3000005];

    // scan all
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &V[i]);
    }

    // set left and right
    int L = 1, R = N, s, l;

    // do it
    while (1) {

        // create random
        int F = V[L + rand() % (R - L + 1)], aux, k, l;

        // iterate smaller than V
        k = 0;
        for (int i = L; i <= R; ++i) {
            if (V[i] < F) {
                aux = V[L + k];
                V[L + k] = V[i];
                V[i] = aux;
                ++k;
            }
        }

        // iterate larger than V
        l = 0;
        for (int i = R; i >= L; --i) {
            if (V[i] > F) {
                aux = V[R - l];
                V[R - l] = V[i];
                V[i] = aux;
                ++l;
            }
        }

        // where is it?
        if (K <= k + L - 1) {

            // is it done?
            if (k == 1) {
                A = V[L];
                break;
            }

            // on the left side
            R = L + k - 1;


        } else if (K >= R - l + 1) {

            // is it done?
            if (l == 1) {
                A = V[R];
                break;
            }

            // on the right
            L = R - l + 1;

        } else {

            // in the center :)
            A = F;
            break;

        }

    }
  
}

void write() {

    // output file
    freopen("sdo.out", "w", stdout);

    // print answer
    printf("%d\n", A);
    
}

int main() {

    read();

    solve();

    write();
    
    return 0;
    
}