Cod sursa(job #1948290)

Utilizator tudoras8tudoras8 tudoras8 Data 31 martie 2017 22:51:29
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <ctime>
#include <cstdlib>
#include <cstdio>

using namespace std;

FILE* in;
FILE* out;

const int MAXN = 3000001;
int n, K, v[MAXN];

int part(int li, int lf) {
    int i = li, j = lf, p = v[li + (rand() % (lf - li + 1))];
    
    while (1) {
        while (v[i] < p) {
            i++;
        }
        while (p < v[j]) {
            j--;
        }
        if (i < j) {
            swap(v[i], v[j]);
        } else {
            return j;
        }
    }
    
    return 0;
}

void sel(int li, int lf, int k) {
    if (li >= lf) {
        return;
    }
    
    int q = part(li, lf);
    int t = q - li + 1;
    
    if (t >= k) {
        sel(li, q - 1, k);
    } else {
        sel(q + 1, lf, k - t);
    }
}

int main(int argc, const char * argv[]) {
    in = fopen("sdo.in", "r");
    out = fopen("sdo.out", "w");
    
    fscanf(in, &n, &K);
    for (int i = 1; i <= n; i++) {
        fscanf(in, v[i]);
    }
    
    srand((int) time(NULL));
    
    sel(1, n, K);
    
    fprintf(out, v[K]);
    
    return 0;
}