Cod sursa(job #1443102)

Utilizator stoianmihailStoian Mihail stoianmihail Data 26 mai 2015 22:59:36
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <ctype.h>
#include <time.h>

#define Nadejde  3000000
#define Dragoste 4096

int   n;
char  c;
char  buff[Dragoste];
short pos = Dragoste;
int   petq[Nadejde + 1];

inline char getChar(FILE *f) {
    if (pos == Dragoste) {
        fread(buff, 1, Dragoste, f);
        pos = 0;
    }
    return buff[pos++];
}

inline void freadf(FILE *f, int *result) {
    *result = 0;
    do {
        c = getChar(f);
    } while (!isdigit(c));
    do {
        *result = (*result << 3) + (*result << 1) + c - '0';
        c = getChar(f);
    } while (isdigit(c));
}

inline int myNth_element(int begin, int end, int k) {
    int temp;
    int e = end;
    int b = begin;
    if (b == e) {
        return petq[b];
    }
    int pivot = petq[rand() % (e - b + 1) + b];
    while (b <= e) {
        while (petq[b] < pivot) {
            b++;
        }
        while (petq[e] > pivot) {
            e--;
        }
        if (b <= e) {
            temp = petq[b];
            petq[b++] = petq[e];
            petq[e--] = temp;
        }
    }
    if (k <= e - begin + 1) {
        return myNth_element(begin, e, k);
    } else {
        return myNth_element(e + 1, end, k - (e - begin + 1));
    }
}

int main() {
    int i;
    int k;
    srand(time(NULL));
    FILE *f = fopen("sdo.in", "r");

    freadf(f, &n);
    freadf(f, &k);
    for (i = 1; i <= n; i++) {
        freadf(f, &petq[i]);
    }
    fclose(f);

    f = fopen("sdo.out", "w");
    fprintf(f, "%d\n", myNth_element(1, n, k));
    fclose(f);

    printf("Hristos S-a inaltat!");
    return 0;
}